在我的Perl脚本中,它以高占用内存的累积速度运行。我已经尝试在不再需要时立即清除可疑变量,但问题无法解决。是否有任何方法可以在执行块之前和之后监视内存占用的变化?
答案 0 :(得分:5)
我最近不得不解决其中一个程序中的内存不足情况。虽然我不以任何方式声称自己是这方面的专家,但我会分享我的发现,希望它能使某人受益。
首先,您应确保不仅存在高而稳定的内存使用情况。如果内存使用率稳定,即使您的进程不适合可用内存,下面的讨论也不会有太大帮助。以下是Perl的文档here和here,in this SO question,in this PerlMonks discussion中值得一读的一些注意事项。如果您熟悉Perl内部,那么有一个有趣的分析here。在Tim Bunce's presentation中可以找到许多深层信息。您应该知道Perl可能不会将内存返回给系统even if you undef
stuff。最后,来自Perl开发人员的this opinion您不应该过多担心内存使用情况。
如果内存使用量稳步增长,最终可能会导致内存不足。我的问题结果是循环引用的情况。根据StackOverflow上的this answer,循环引用是Perl中内存泄漏的常见原因。根本原因是Perl使用引用计数机制和cannot release循环引用的内存until program exit。 (注意:我还没有能够在Perl的最后一个声明的文档中找到更新的版本。)
您可以使用Scalar::Util::weaken来减弱'循环参考链(另见http://perlmaven.com/eliminate-circular-reference-memory-leak-using-weaken)。
system("ps -p $$ -o vsz,rsz,sz,size")
注意:正如Tim Bunce的演示文稿中所述,您将要跟踪VSIZE而不是RSS