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   

谢谢!

4

1 回答 1

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检查内存周期)。

于 2008-11-17T18:21:18.337 回答