perl中的内存管理

perl中的内存管理,perl,memory-management,perl-module,perl-data-structures,Perl,Memory Management,Perl Module,Perl Data Structures,我面临一个奇怪的问题,即在perl中处理内存。 我在一个perl应用程序中工作,它使用相当大的散列结构。我正在为对象分配has ref。但最后,似乎即使我取消分配对象和散列,内存使用量仍然保持不变 以下是问题的示例: my $hash = {}; ............. this ds gets populated with a lot of data ... ....... { my $obj = new Class("data"=>$hash); .....

我面临一个奇怪的问题,即在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

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

你真的不能将内存返回操作系统。Perl通常会保留它以便以后重新分配,尽管它偶尔会进行垃圾收集


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


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

对象的情况下会发生什么?当对象超出范围时,将调用析构函数。这还会保留对象中定义的词汇变量的内存吗?@Kallol,这种情况与超出范围的普通变量没有什么不同,只是您可以对对象进行一些自定义清理。内存将是免费的,Perl可以将其用于其他用途,但Perl仍然不会将其返回给系统。