2008-11-17 237 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