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

前端之家收集整理的这篇文章主要介绍了如何识别在Perl脚本中累积内存使用的位置?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的Perl脚本中,它以高占用内存的累积速度运行.我已经尝试在不再需要时立即清除可疑变量,但问题无法解决.是否有任何方法可以在执行块之前和之后监视内存占用的变化?

解决方法

我最近不得不解决我的一个程序中的内存不足情况.虽然我没有声称自己是这方面的专家,但我将分享我的发现,希望它能使某些人受益.

1.高,但稳定的内存使用

首先,您应确保不仅存在高而稳定的内存使用情况.如果内存使用率稳定,即使您的进程不适合可用内存,下面的讨论也不会有太大帮助.以下是Perl文档herehere,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::LeakTracehttps://metacpan.org/pod/Test::Memory::Cycle;一个例子here
> https://metacpan.org/pod/Devel::InterpreterSize

猜你在找的Perl相关文章