我有一个在 linux 机器上运行的程序。它派生一个发送邮件的进程,并经常记录派生失败消息,说明它无法分配内存。
当我检查常驻内存的大小时,它大约为 12Gb(在这台机器上交换配置为只有 1Gb)。
有没有办法可以确定这块巨大的内存不是泄漏而只是内存增长?
另外,是否有可以调整的系统限制,以便我不会遇到任何分叉失败?
我有一个在 linux 机器上运行的程序。它派生一个发送邮件的进程,并经常记录派生失败消息,说明它无法分配内存。
当我检查常驻内存的大小时,它大约为 12Gb(在这台机器上交换配置为只有 1Gb)。
有没有办法可以确定这块巨大的内存不是泄漏而只是内存增长?
另外,是否有可以调整的系统限制,以便我不会遇到任何分叉失败?
要检查内存泄漏,您可能希望在 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)。
我刚刚在嵌入式系统上得到了这个。没有任何限制,并且有足够的空闲 RAM 用于一个小df
进程,所以这让我感到困惑。然后我记得这fork()
是通过写时复制工作的——所以在不久的将来,子进程可能需要与父进程一样多的 RAM。如果您看到机器应该有大量可用 RAM,请记住一点——它的可用 RAM 是否至少与调用进程fork()
使用的一样多?