2012-01-19 40 views
5

我的代碼如下所示:如何在Perl中釋放內存?

my %var; 
my %var_new={}; 

while(1){ 
    while(my ($k,$v)=each %var){ 
      &a_sub($v); 
    } 
    %var={}; # A 
    map { $var{$_}=$var_new{$_}; } keys %var_new; 
    %var_new={}; # B 
} 

sub a_sub { #....} # will fill %var_new 

我的程序的內存使用情況不斷地增高。

看來Perl不會在A線和B線

可用內存我如何可以手動Perl來釋放內存使用%var%var_new

+4

你爲什麼要將hashref指定給散列? – Quentin

+8

'嚴格使用;使用警告;使用診斷「(後者僅在開發過程中) – Quentin

+0

儘管您發佈的代碼存在缺陷,但您沒有理由使用更多內存來發布代碼。 – ikegami

回答

7

IIRC,一旦Perl已經從操作系統分配的存儲器,它保存到該存儲器的處理的壽命。在可能的情況下,Perl會重用它已經分配的內存,而不是向操作系統要求更多,但是你不會看到進程減少所使用的內存。

+1

你說的在實踐中是真實的,但Perl *可以*實際將內存返回給操作系統。在一般情況下這是否可取是另一個問題。 – tsee

+0

如何強制釋放未使用的內存到OS? – Artem

+0

是的。一旦進程從內存中分配操作系統的內存,它就會保留它直到其終結。它發生在任何語言上,不僅僅是Perl。說,它被編譯爲使用mmap而不是它自己的malloc,只要內存完全不被使用,內存就可以被釋放。 – Luchostein

1

我覺得用undef功能:

undef %var, %var_new; 

可能做的伎倆。 那是當然,如​​果你不需要這些哈希裏面有什麼了

+0

將'%var'和'%var_new'設置爲'{}'應該具有相同的效果。 –

+0

它沒有。用Devel :: Peek檢查。 – daxim

+5

@KeithThompson不,將'%var'和'%var_new'設置爲'()'應該具有相同的效果。 – Stamm

13

如果您用過strictwarnings的,你會看到:

參考發現,甚至大小列表預期

A線和B線不會做你認爲他們做的事。他們實際上將一個空字符串引用的字符串化版本作爲關鍵字,而將undef作爲其值。即使散列現在幾乎爲空,內存也沒有標記爲可重用,因爲您沒有使用適當的語句。

嘗試使用在線路A中的下面的語句和B之一​​:

undef %var; # this one 
%var =(); # or this one