2008-11-17 179 views
3

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

谢谢!

回答

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

+0

确定但为什么perl -MDevel :: LeakTrace :: Fast -e'我们的@a =(1);'显示没有泄漏?但perl -MDevel :: LeakTrace :: Fast -e'我们的@a =(1);我们的@b =(1);' ? – Pat 2008-11-17 18:51:10