我有一个使用POE的应用程序,它有大约10个会话执行各种任务。随着时间的推移,应用程序开始消耗越来越多的RAM,即使应用程序在80%的时间内处于空闲状态,此使用率也不会下降。我目前唯一的解决方案是经常重启这个过程。
我不允许在这里发布我的代码所以我意识到很难获得帮助,但也许有人可以告诉我自己能找到什么?
答案 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