为什么泄漏?

时间:2008-11-17 16:49:06

标签: perl memory memory-leaks

为什么这会在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   

谢谢!

1 个答案:

答案 0 :(得分:10)

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

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 :: modules(例如,使用Devel::Cycle检查内存周期)。