【问题标题】:Memory Management in perlperl 中的内存管理
【发布时间】:2012-09-19 03:29:33
【问题描述】:

我遇到了一个在 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 memory-management perl-module perl-data-structures


    【解决方案1】:

    您无法真正将内存返回给操作系统。 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/

    【讨论】:

    • 在对象的情况下会发生什么?当一个对象超出范围时,析构函数被调用。这还会保留对象中定义的词法变量的内存吗?
    • @Kallol,这种情况与超出范围的普通变量没有什么不同,只是您可以对对象进行一些自定义清理。内存可供 Perl 用于其他用途,但 Perl 仍然不会将其归还给系统。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2011-04-30
      • 2011-07-25
      • 2011-01-30
      • 2012-08-27
      • 2012-10-06
      • 2016-12-01
      相关资源
      最近更新 更多