Perl:转储所有实时数据

时间:2016-07-10 00:37:01

标签: perl memory-leaks

我正在尝试识别用perl编写的GNU Parallel中可能存在的内存泄漏。

我可以看到最大内存使用量(使用CustomView(picker: PickerType.datePicker).showDatePicker("Select date") CustomView(picker: PickerType.pickerView).showPickerView("Select data") )随作业数量线性增加,并且在某种程度上取决于命令的长度:

time -v

在10000个工作岗位上,这几乎不是问题,但是在1000000个工作岗位上就开始了。

如何确定占用多余空间的内容?当GNU Parallel退出时,我可以转储Perl认为存在的所有数据吗?我觉得只需通过实时数据,我就会知道是否存在泄漏或是否可以解释额外的内存使用情况。

我已经尝试了What’s the best way to discover all variables a Perl application has currently defined?,但它找不到所有变量,我知道存在;比如这个例子:

# Very long command line
$ seq 10000 | time -v parallel true <<50000 x's here>> 2>&1 | grep --colour=auto --colour=auto 'Maximum resident set size'
Maximum resident set size (kbytes): 20936

# Short command line
$ seq 10000 | time -v parallel true 2>&1 | grep --colour=auto --colour=auto 'Maximum resident set size'
Maximum resident set size (kbytes): 18692

# Few jobs - short argument
$ seq 1000 | time -v parallel true  2>&1 | grep --colour=auto --colour=auto 'Maximum resident set size'
Maximum resident set size (kbytes): 16224

# Few jobs - long argument
$ seq 1000| perl -pe '$a="x"x50000;s/$/$a/' | time -v parallel true  2>&1 | grep --colour=auto --colour=auto 'Maximum resident set size'
Maximum resident set size (kbytes): 18448

1 个答案:

答案 0 :(得分:2)

这帮助我找出了罪魁祸首:

use Devel::Symdump;

my $obj = Devel::Symdump->rnew();
my @sysout;

for my $v ($obj->scalars()) {
    push @sysout, length(Dumper(eval ('$'.$v)))." \$$v\n";
}
for my $v ($obj->arrays()) {
    push @sysout, length(Dumper(eval ('@'.$v)))." \@$v\n";
}
for my $v ($obj->hashes()) {
    push @sysout, length(Dumper(eval ('%'.$v)))." \%$v\n";
}
print sort { $b <=> $a } @sysout;