如何在Perl中释放内存?

eve*_*box 5 perl garbage-collection

我的代码看起来像:

 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
Run Code Online (Sandbox Code Playgroud)

我的程序的内存使用率一直在上升.

似乎Perl没有在A线和B线释放内存.

我如何可以手动Perl来释放内存使用%var%var_new

Sta*_*amm 13

如果你使用过strictwarnings,你会看到:

参考文献中找到了偶数大小的列表

A行和B行不符合您的想法.它们实际上将对空哈希的引用的字符串化版本指定为键,并将undef作为其值.即使哈希现在几乎为空,内存也不会被标记为可重用,因为您没有使用正确的语句.

尝试在A行和B行使用以下语句之一:

undef %var; # this one
%var = ();  # or this one
Run Code Online (Sandbox Code Playgroud)


che*_*ner 7

IIRC,一旦Perl从操作系统中分配了内存,它就会在进程的生命周期内保留在内存中.在可能的情况下,Perl将重用已经分配的内存而不是向操作系统询问更多内容,但是您不会看到进程使用的内存减少.

  • @Luchostein恭敬地说,这不是真的.`perl -e'$ a ="a"x100_000_000; for(1..10){push @b,"$ _ $ a"; 睡觉10; @ B =(); 睡100;'`这将使用> 1GB 10秒,然后下降<1GB,持续100秒. (2认同)