我该怎么做才能找出是什么导致我的程序随着时间的推移消耗大量内存?

时间:2010-12-09 05:54:23

标签: perl poe

我有一个使用POE的应用程序,它有大约10个会话执行各种任务。随着时间的推移,应用程序开始消耗越来越多的RAM,即使应用程序在80%的时间内处于空闲状态,此使用率也不会下降。我目前唯一的解决方案是经常重启这个过程。

我不允许在这里发布我的代码所以我意识到很难获得帮助,但也许有人可以告诉我自己能找到什么?

5 个答案:

答案 0 :(得分:2)

不要指望流程大小会减少。在进程终止之前,内存不会释放回操作系统。

那就是说,你可能在某个地方的数据结构中有引用循环吗? AFAIK,perl垃圾收集器无法整理引用循环。

您是否在任何地方使用任何XS模块?这些内部可能隐藏着泄漏。

答案 1 :(得分:1)

猜测:你的程序只要在运行就会执行一个循环;在这个循环中,每次出现某些条件时,可能会为缓冲区(或更多)分配内存;由于范围从未退出,因此内存仍然存在并且永远不会被清除。我建议你查一下这样的东西。如果是这种情况,请将分配代码放在从循环中调用的子代码中,并将其放在范围之外,并在返回循环时进行清理。

答案 2 :(得分:1)

看起来Test::Valgrind是一种搜索内存泄漏的工具。我自己从未使用它(但我使用了简单的valgrind和C源代码)。

答案 3 :(得分:1)

一种技术是定期将$ POE :: Kernel :: poe_kernel的内容转储到时间或序列命名的文件中。 $ poe_kernel是跨越所有已知会话及其堆内容的树的根。如果引用泄露的内存,快照应该单调增长。你可以通过稍后用早期快照来找出泄漏的东西。

您可以导出POE_ASSERT_DATA = 1以启用POE的内部数据一致性检查。我不认为它会出现问题,但如果确实如此,我会很高兴收到错误报告。

答案 4 :(得分:1)

Perl无法解析参考环。要么你有僵尸(你可以通过ps axl检测)或你有内存泄漏(参考环/圆)

有大量程序可以检测内存泄漏。 strace,mtrace,Devel :: LeakTrace :: Fast,Devel :: Cycle