解决方法
1.高,但稳定的内存使用
首先,您应确保不仅存在高而稳定的内存使用情况.如果内存使用率稳定,即使您的进程不适合可用内存,下面的讨论也不会有太大帮助.以下是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您不应该过多担心内存使用情况.
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.进一步阅读
> Tim Bunce’s presentation(slide here);也在这blog post
> http://www.perlmonks.org/?node_id=472366
> Perl memory usage profiling and leak detection?
>当然还有@mpapec给出的链接:http://perlmaven.com/how-much-memory-does-the-perl-application-use
4.工具
>在Unix上,你可以做系统(“ps -p $$-o vsz,rsz,sz,size”)警告:正如Tim Bunce的演示中所解释的那样,你需要跟踪VSIZE而不是RSS
> How to find the amount of physical memory occupied by a hash in Perl?
> https://metacpan.org/pod/Devel::Size
>以及Tim Bunce最近的一篇文章,它增加了估算翻译记忆库总大小的可能性:https://metacpan.org/pod/Devel::SizeMe
>在测试脚本中,您可以使用https://metacpan.org/pod/Test::LeakTrace和https://metacpan.org/pod/Test::Memory::Cycle;一个例子here
> https://metacpan.org/pod/Devel::InterpreterSize