相关疑难解决方法(0)

为什么在释放大型数组时Perl不会垃圾收集内存?

我知道Perl使用基于引用计数的垃圾收集.当变量超出范围时,引用计数递减,如果REFcount变为0,则取消分配内存.但是当我追踪下面显示的一个小例子时,我无法找到解除分配的情况.

print "start..";
Run Code Online (Sandbox Code Playgroud)

启动状态下的内存使用情况

sub func
{
    my $length = 8*1024*1024;
    my $array = [1..$length];
Run Code Online (Sandbox Code Playgroud)

分配后的内存使用情况

}

func();

print "done..";
Run Code Online (Sandbox Code Playgroud)

垃圾收集阶段的内存使用情况

在该示例中,当程序启动时,Perl.exe占用约3 MB的物理内存.在func()调用期间分配后,Perl.exe占用~370 MB内存.但是在func()调用之后,分配的内存应该被垃圾收集.为什么不这样做?

期待您的回复.

perl memory-management

14
推荐指数
2
解决办法
4647
查看次数

在Perl中,如何向操作系统释放内存?

我在Perl中遇到了一些内存问题.当我填满一个大哈希时,我无法将内存释放回操作系统.当我使用标量和使用时undef,它会将内存返回给操作系统.

这是我写的测试程序.

#!/usr/bin/perl
###### Memory test
######

## Use Commands
use Number::Bytes::Human qw(format_bytes);
use Data::Dumper;
use Devel::Size qw(size total_size);

## Create Varable
my $share_var;
my %share_hash;
my $type_hash = 1;
my $type_scalar = 1;

## Start Main Loop
while (true) {
    &Memory_Check();
    print "Hit Enter (add to memory): "; <>;
    &Up_Mem(100_000);
    &Memory_Check();

    print "Hit Enter (Set Varable to nothing): "; <>;
    $share_var = "";
    $share_hash = ();
    &Memory_Check();

    print "Hit Enter (clean data): "; <>;
    &Clean_Data();
    &Memory_Check();

    print …
Run Code Online (Sandbox Code Playgroud)

perl memory-management

12
推荐指数
3
解决办法
1万
查看次数

如何在Perl中释放内存?

我的代码看起来像:

 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

perl garbage-collection

5
推荐指数
2
解决办法
9449
查看次数

如何从内存中删除perl对象

我在编写的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'} = [];
        } …
Run Code Online (Sandbox Code Playgroud)

perl memory-management

2
推荐指数
1
解决办法
253
查看次数