如何识别在Perl脚本中累积内存使用的位置?

时间:2014-05-11 07:09:43

标签: perl memory memory-management

在我的Perl脚本中,它以高占用内存的累积速度运行。我已经尝试在不再需要时立即清除可疑变量,但问题无法解决。是否有任何方法可以在执行块之前和之后监视内存占用的变化?

1 个答案:

答案 0 :(得分:5)

我最近不得不解决其中一个程序中的内存不足情况。虽然我不以任何方式声称自己是这方面的专家,但我会分享我的发现,希望它能使某人受益。

1。高而稳定的内存使用

首先,您应确保不仅存在高而稳定的内存使用情况。如果内存使用率稳定,即使您的进程不适合可用内存,下面的讨论也不会有太大帮助。以下是Perl的文档hereherein this SO questionin this PerlMonks discussion中值得一读的一些注意事项。如果您熟悉Perl内部,那么有一个有趣的分析here。在Tim Bunce's presentation中可以找到许多深层信息。您应该知道Perl可能不会将内存返回给系统even if you undef stuff。最后,来自Perl开发人员的this opinion您不应该过多担心内存使用情况。

2。内存使用量稳步增长

如果内存使用量稳步增长,最终可能会导致内存不足。我的问题结果是循环引用的情况。根据StackOverflow上的this answer,循环引用是Perl中内存泄漏的常见原因。根本原因是Perl使用引用计数机制和cannot release循环引用的内存until program exit。 (注意:我还没有能够在Perl的最后一个声明的文档中找到更新的版本。)

您可以使用Scalar::Util::weaken来减弱'循环参考链(另见http://perlmaven.com/eliminate-circular-reference-memory-leak-using-weaken)。

3。进一步阅读

4。工具