【问题标题】:Why does this leak?为什么会泄漏?
【发布时间】:2008-11-17 16:49:06
【问题描述】:

为什么会在 Perl 中泄漏?

$ perl -MDevel::LeakTrace::Fast -e 'our @a=(1);our @b=(1)'
leaked SV(0x0x84e053c) from -e line 1

$ perl -v
This is perl, v5.8.0 built for i386-linux-thread-multi
[...]

$ uname -a
Linux ant1 2.4.21-20.ELsmp #1 SMP Wed Aug 18 20:46:40 EDT 2004 i686 i686 i386 GNU/Linux   

谢谢!

【问题讨论】:

    标签: perl memory memory-leaks


    【解决方案1】:

    它没有。把它放在一个循环中,你自己看看:进程内存不会随着每次循环迭代而增加。

    for(1 .. 10_000_000)
    {
      our @a = (1);
      our @b = (1);
    }
    

    所有“泄漏”消息(可能)告诉您的是程序以未完成的变量退出。要使该消息静音,请在程序结束之前取消定义变量:

    perl -MDevel::LeakTrace::Fast -e 'our @a = (1); our @b = (1); undef @a; undef @b;'
    

    FWIW,在 perl 5.10.0 下打印相同的消息,所以我不确定升级 perl 是否是答案。

    至于为什么该消息在某些情况下出现而在其他情况下不出现,这可能是Devel::LeakTrace::Fast 的变幻莫测。许多 Perl 泄漏检测模块都有这样的“特质”(好心地说)。

    底线:测试泄漏的唯一 100% 可靠方法是查看内存使用量是否随着重复执行相关代码而增加。如有疑问,请回过头来。

    然而,各种 Devel::* 模块可以提供帮助。但首先最好隔离泄漏代码:禁用一半代码并查看泄漏是否仍然存在。现在您已将搜索范围缩小了一半。重复几次,您将很快找到泄漏的函数或语句。然后查看该代码在放入单独的脚本时是否仍然泄漏。最后,要查看泄漏的原因,请使用 Devel:: 模块(例如,使用 Devel::Cycle 检查内存周期)。

    【讨论】:

    • 好的,但是为什么 perl -MDevel::LeakTrace::Fast -e 'our @a = (1);'显示没有泄漏?但是 perl -MDevel::LeakTrace::Fast -e 'our @a = (1);our @b = (1);' ?
    • 谢谢约翰,问题是我的程序确实存在泄漏,似乎 Devel::LeakTrace::Fast 不会有帮助,因为它显示了许多这样的误报。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多