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

标签 perl memory memory-management

在我的 Perl 脚本中,它以占用内存的高累积速度运行。我曾尝试在不再需要时立即清除可疑变量,但问题无法解决。有什么方法可以监控block执行前后内存占用的变化吗?

最佳答案

我最近不得不对我的一个程序中的内存不足情况进行故障排除。虽然我不以任何方式声称自己是这方面的专家,但我将分享我的发现,希望它能对某人有所帮助。

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。工具

关于perl - 如何识别 Perl 脚本中累积内存使用的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589962/

相关文章:

perl - 错误 "undefined subroutine"与 perl File::Copy mkpath

regex - 用于替换字符串的正则表达式,但不替换分配给标量的值

c - 我需要释放结构中的变量吗?

r - 即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?

c++ - 如何将动态对象数组传递给另一个类的参数化构造函数?

memory-management - Linux PowerPC Book E 通过热重启保留原始 RAM

regex - 在排序比较器中修改字符串

perl - 如何在 perl 中禁用 stdout 重定向到文件缓冲?

iOS Google Analytics 内存增长失控 FAST

c - 虚拟内存映射碎片会导致性能问题吗?