为什么泄漏?

Pat*_*Pat 3 memory perl 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   
Run Code Online (Sandbox Code Playgroud)

谢谢!

Joh*_*usa 10

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

for(1 .. 10_000_000)
{
  our @a = (1);
  our @b = (1);
}
Run Code Online (Sandbox Code Playgroud)

所有"泄漏"消息(可能)都告诉你,程序退出时有很多变量.要使该消息静音,请在程序结束前取消变量:

perl -MDevel::LeakTrace::Fast -e 'our @a = (1); our @b = (1); undef @a; undef @b;'
Run Code Online (Sandbox Code Playgroud)

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

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

结论:测试泄漏的唯一100%可靠方法是查看重复执行相关代码是否会增加内存使用量.如果有疑问,请回到原点.

但是,各种Devel ::*模块可以提供帮助.但首先最好隔离泄漏的代码:禁用一半代码并查看泄漏是否仍然存在.现在你将搜索范围缩小了一半.重复几次,你会很快找到泄漏的功能或陈述.然后查看当放入单独的脚本时该代码是否仍然泄漏.最后,要了解它为何泄漏,请使用Devel :: modules(例如,使用Devel :: Cycle检查内存周期).