5

我遇到了一个在 perl 中处理内存的奇怪问题。我正在一个使用相当大的哈希结构的 perl 应用程序中工作。我正在分配 has ref 来回对象。但最后似乎即使我正在释放对象和哈希,内存使用量也保持不变。

这是问题的一个示例:

 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

我想我犯了一些非常基本的错误。有人可以建议吗?

4

2 回答 2

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/

于 2012-09-27T11:06:14.220 回答
4

一般来说,Perl 内存管理会做您需要做的事情,您不必担心。例如,为程序的其余部分分配大量内存有什么害处?可能没有。如果您的操作系统有内存不足的危险,Perl将释放它。

假设您有一些特殊情况,例如在后台不断运行的脚本,但偶尔需要执行内存密集型任务。您可以通过将其分成两个脚本来解决这个问题:background.pl 和 memory-intensive-task.pl。background.pl 将在需要时执行 memory-intensive-task.pl。当这个程序完成并退出时,内存将被释放。

于 2012-09-27T13:10:53.300 回答