我有一个在linux机器上运行的程序。它会强制进程发送邮件,并经常记录fork失败消息,指出它无法分配内存。
当我检查驻留内存的大小时,它会出现在12Gb左右(此机器上的交换配置为仅1Gb)。
有没有办法可以确定这一大块内存不是泄漏而只是内存增长?
此外,是否存在可以调整的系统限制,以便我不会出现任何fork故障?
答案 0 :(得分:3)
要检查内存泄漏,您可能希望在Valgrind下运行该程序:http://valgrind.org
要从控制台/ shell获取/设置限制,可以使用ulimit
命令。
从程序内部,系统调用getrlimit()
/ setrlimit()
提供此功能。
由于fork()
导致内存可能紧张的情况的另一种解决方法是立即使用vfork()
,然后调用exec*()
函数系列的成员。
来自man vfork
:
vfork()是 clone(2)的特例。它用于创建新进程而无需复制父进程的页表。在创建子项的性能敏感应用程序中,它可能很有用,然后立即发出 execve(2)。
vfork()与 fork(2)的不同之处在于,父级会暂停,直到子级终止(通常,通过调用 _exit(2)< / strong>,或在传递致命信号后异常),或致电 execve(2)。直到那个 point,子进程与其父进程共享所有内存,包括堆栈。孩子不能从当前功能返回或致电退出(3),但可以致电 _exit(2)。
答案 1 :(得分:1)
我刚刚在嵌入式系统上得到了这个。没有限制,并且有一个小df
进程有足够的可用RAM,所以它让我很困惑。然后我记得fork()
通过写时复制工作 - 所以子进程有可能在不久的将来需要与父进程一样多的RAM。如果您发现该机器应该有大量可用内存,请记住这一点 - 它是否至少具有与调用fork()
的进程一样多的可用内存?