4

我有一个在 linux 机器上运行的程序。它派生一个发送邮件的进程,并经常记录派生失败消息,说明它无法分配内存。

当我检查常驻内存的大小时,它大约为 12Gb(在这台机器上交换配置为只有 1Gb)。

有没有办法可以确定这块巨大的内存不是泄漏而只是内存增长?

另外,是否有可以调整的系统限制,以便我不会遇到任何分叉失败?

4

2 回答 2

3

要检查内存泄漏,您可能希望在 Valgrind 下运行程序:http: //valgrind.org


要从控制台/shell 获取/设置限制,有ulimit可用的命令。

从程序内部,系统调用getrlimit()/setrlimit()提供此功能。


fork()对于由于ing导致内存紧张的情况,另一种解决方法是vfork()立即使用,然后调用exec*()函数家族的成员。

来自man vfork

vfork()是clone(2)的一个特例。它用于在不复制父进程的页表的情况下创建新进程。它可能在创建子节点的性能敏感应用程序中很有用,然后立即发出execve(2)

vfork()fork(2)的不同之处在于,父进程被挂起,直到子进程终止(正常情况下,通过调用_exit(2)或异常情况下,在传递致命信号后),或者调用execve(2 ) . 在此之前,子进程与其父进程共享所有内存,包括堆栈。孩子不能从当前函数返回或调用exit(3),但可以调用_exit(2)

于 2013-08-22T08:06:39.403 回答
1

我刚刚在嵌入式系统上得到了这个。没有任何限制,并且有足够的空闲 RAM 用于一个小df进程,所以这让我感到困惑。然后我记得这fork()是通过写时复制工作的——所以在不久的将来,子进程可能需要与父进程一样多的 RAM。如果您看到机器应该有大量可用 RAM,请记住一点——它的可用 RAM 是否至少与调用进程fork()使用的一样多?

于 2014-03-23T22:33:35.073 回答