如何从内存中删除perl对象

use*_*095 2 perl memory-management

我在编写的perl脚本的内存使用方面遇到了一些问题(下面的代码).该脚本启动一些变量,用数据填充它们,然后再次取消定义它们.但是,删除所有内容后脚本的内存使用量仍然很高,不包含任何数据.

Accoring到ps脚本使用的前39秒内1.027 MB内存(RSS)(foreach循环之前,所以一切).然后,内存使用量开始上升,最终在204.391 Mb和172.410 Mb之间波动.但是,即使在脚本的最后10秒内(应该删除所有数据),内存使用量也不会低于172.410 Mb.

有没有办法永久删除perl中的变量及其中的所有数据(为了减少脚本的内存使用量)?如果是这样,我该怎么做?

use strict;
use warnings;

sleep(30);

my $ELEMENTS = 1_000_000;
my $MAX_ELEMENT = 1_000_000_000;
my $if_condition = 1;

sleep(5);

my %hash = (1 => {}, 2 => {}, 3 => {}, 4 => {});

foreach my $key (keys %hash){
    if( $if_condition ){
        my $arrref1 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
        my $arrref2 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
        my $arrref3 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];

        sleep(2);

        if(!defined($hash{$key}->{'amplification'})){
            $hash{$key}->{'amplification'} = [];
        }

        push(@{$hash{$key}->{'amplification'}},@{$arrref1});
        undef($arrref1);
        push(@{$hash{$key}->{'amplification'}},@{$arrref2});
        undef($arrref2);
        push(@{$hash{$key}->{'amplification'}},@{$arrref3});
        undef($arrref3);


        sleep(3);

        delete($hash{$key});

        sleep(5);
    }
}

sleep(10);
Run Code Online (Sandbox Code Playgroud)

Dr.*_*che 6

Perl FAQ 3 - 如何释放数组或散列,以便我的程序缩小?

你通常不能.分配给词汇(即my()变量)的内存即使超出范围也无法回收或重用.如果变量返回范围,则保留它.分配给全局变量的内存可以通过使用undef()和/或delete()重用(在程序中).

在大多数操作系统上,分配给程序的内存永远不会返回给系统.这就是为什么长期运行的程序有时会重新执行的原因.某些操作系统(特别是使用mmap(2)分配大块内存的系统)可以回收不再使用的内存,但在这样的系统上,必须配置和编译perl以使用OS的malloc,而不是perl.

一般来说,内存分配和取消分配不是你可以或应该在Perl中担心的事情.

另请参阅"如何使我的Perl程序占用更少的内存?"