在我的 Perl 脚本中,它以占用内存的高累积速度运行。我曾尝试在不再需要时立即清除可疑变量,但问题无法解决。有什么方法可以监控block执行前后内存占用的变化吗?
最佳答案
我最近不得不对我的一个程序中的内存不足情况进行故障排除。虽然我不以任何方式声称自己是这方面的专家,但我将分享我的发现,希望它能对某人有所帮助。
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 (幻灯片 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 上,您可以执行
system("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
关于perl - 如何识别 Perl 脚本中累积内存使用的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589962/