2012-09-27 108 views
5

我在perl中遇到了一個處理內存的奇怪問題。 我正在使用相當大的散列結構的perl應用程序中工作。我正在分配具有來回的對象。但最後,即使我正在釋放對象和散列,內存使用情況仍然保持不變。perl中的內存管理

這是問題的一個樣本:

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

我覺得我做了一些非常基本的錯誤。任何人都可以建議嗎?

回答

3

一般來說,Perl的內存管理做你需要做什麼,你不必擔心它。例如,爲程序的其餘部分分配大量內存有什麼危害?可能沒有。 Perl 釋放它,如果你的操作系統有內存不足的危險。

假設您有一些特殊情況,如在後臺不斷運行的腳本,但偶爾需要執行內存密集型任務。你可以通過將它分成兩個腳本來解決這個問題:background.pl和memory-intensive-task.pl。 background.pl會在需要時執行memory-intensive-task.pl。當程序完成並退出時,內存將被釋放。

12

您不能真正將內存返回到操作系統。 Perl通常會保留它以便稍後重新分配它,儘管它會偶爾收集垃圾。

http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

發生在物體的情況下會發生什麼?當一個對象超出範圍時,析構函數被調用。這是否仍然保持對象中定義的詞彙變量的記憶? – Kallol

+0

@Kallol,這種情況與超出範圍的正常變量沒有什麼不同,除了可以對對象執行一些自定義清理。內存*將*免費供Perl使用,但Perl仍然不會將其返回給系統。 – dan1111

+0

可以做什麼樣的客戶清理? – Kallol