我在 Windows 2003 Server 上使用 ActiveState Perl 5.6,并且遇到了一些内存泄漏问题。是否有任何好的工具(甚至可以提供线索的坏工具)我可以用来帮助找到它们。
3 回答
所有 perl 程序内存泄漏要么是一个持有引用的 XS,要么是一个循环数据结构。如果您知道哪些结构可能包含循环,则Devel::Cycle是查找循环引用的好工具。Devel::Peek可用于查找引用计数高于预期的对象。
如果您不知道该去哪里寻找,Devel::LeakTrace::Fast可能是一个不错的选择,但您需要一个为调试而构建的 perl。
如果您怀疑泄漏在 XS 空间内,那就更难了,而Valgrind可能是您最好的选择。Test::Valgrind可能会帮助您减少需要搜索的代码量,但这在 Windows 上不起作用,因此您必须将(至少是泄漏的部分)移植到 Linux 才能做到这一点。
Devel::Gladiator将向您显示 Perl 在任何给定时间在内存中具有多少每种变量类型的列表,以及它们所引用的内容。对于确定正在创建但未释放的对象类型非常有用。
由于尚未提及,因此Devel::Size将报告数据结构的大小。没有给出其他信息,它用来确定数据结构“边界”的规则是不透明的。对于简单的结构,这不是问题。
Devel::SizeMe是我的一个爱好项目,旨在解决 Devel::Size 的问题,并使perl 解释器的整个内存使用情况可视化。有关更多信息,请参阅我的博客,包括指向截屏视频和视频的链接。我的目标之一是实现泄漏的检测和可视化,但这还有很长的路要走。
更新:
除了其他评论之外,您可能会发现我在 LPW2013 上的Perl Memory Use 演讲很有用。我建议观看截屏视频,因为它解释了幻灯片,最后有一些可爱的视觉效果和一些问答。
我还建议查看我在演讲中提到的 Paul Evans Devel::MAT模块。