【问题标题】:Perl program leaking memory when compiling regexPerl 程序在编译正则表达式时泄漏内存
【发布时间】:2017-09-03 11:25:05
【问题描述】:

我有一个程序显示出似乎是内存泄漏的情况,但我无法追踪它。我为证明这一点而编写的测试程序表现得相当奇怪,我想确保我理解原因。

在示例中,有两个数组,一个名为 regexLeak,另一个名为 noLeak。 noLeak 数组只是使用两个简单的正则表达式作为基线。 regexLeak 数组包含使用字符集的正则表达式。

测试程序获取一个数组的内容,大概填充了正则表达式模式,将其传递给一个函数,在该函数中正则表达式被编译并放入一个数组中,该数组作为引用传回。

当“test”数组设置为 noLeak 时,没有泄漏。当“test”数组设置为 regexLeak 时,会出现明显的内存泄漏。但是,如果 regexLeak 数组只包含一个元素,则没有泄漏。哪个元素也没有关系。不过,将这两个元素都放入数组中,内存使用量就会飙升。

#!/usr/bin/perl

use strict;
use warnings;

my @regexLeak;
my @noLeak;

# Leaks only when both elements are added to @regexLeak
push(@regexLeak,'user = ([a-zA-Z0-9-_.@]+)');
push(@regexLeak,'admin = ([a-zA-Z0-9-_.@]+)');

# No leaks
push(@noLeak, 'simpleRegex');
push(@noLeak, 'anotherSimpleOne');

my @test = @regexLeak;

my $compiled = compileRegex(@test);

while (1) {

    $compiled = compileRegex(@test);
    # print scalar @{$compiled}."\n";
    # select(undef, undef, undef, 0.25);
}

sub compileRegex {
    my (@r) = @_;

    my @compiled;

    foreach my $regex (@r) {
        my $c = qr/$regex/;
        push(@compiled,$c);
    }

    return \@compiled;
}

其中的一些元素取自出现此问题的生产程序。例如,全局 $compiled 变量。我想把它放在这里,因为通过他们解释会帮助我理解。这也是一个长期运行的程序,因此泄漏是一个问题。

使用 ps -aux 并查看 RSS 和 VSZ 大小观察到内存泄漏。

任何帮助或指导将不胜感激,谢谢!

编辑: 如果您需要任何其他环境详细信息,请告诉我

为 x86_64-linux-thread-multi 构建的 Perl v5.24.0

【问题讨论】:

  • 您如何看待此清单?内存泄漏与增长的内存不同。您是否在运行期间不断向阵列推送新事物?您是否在开发环境中使用不应该“泄漏”的正则表达式完全复制了这个?
  • 我复制粘贴了你的程序,没有发现任何异常。它已经运行了几分钟,第二次。内存使用量为固定值(例如:VmRSS 2392 kB,VmSize:129916 kB),CPU 以 100% 旋转。在 v5.16 上,多线程 x86_64。
  • 你能试试 Perl 版本 5.24.1(当前稳定)和/或 5.25.11(当前开发),看看它们是否出现同样的问题?在 5.24.0 发布之后有一些 git 提交,这与正则表达式相关的内存泄漏有关。

标签: regex perl memory-leaks


【解决方案1】:

简短的回答:安装任一

  • v5.16.3v5.18.2(旧版本)
  • 5.25.10(开发版)
  • v5.24.05.24.1 显示内存在增长:) 内存

其他版本未测试。

详细结果:

测试了上面的脚本leak.pl刚刚在脚本顶部添加了这一行:

print "version: $^V ($^X) PID: $$\n";

在第二个终端上我运行这个bash 脚本

while :; do
    ps -o pid=,vsz=,rss=,command= | grep 'perl.*[l]eak'
    sleep 0.5
done

结果

pleenv 5.16.3

$ plenv local 5.16.3
$ perl leak.pl
version: v5.16.3 (/opt/anyenv/envs/plenv/versions/5.16.3/bin/perl5.16.3) PID: 4922
^C

ps (pid=,vsz=,rss=,command=)

 4922  2437208   3264 perl leak.pl
 4922  2441304   3312 perl leak.pl
 ....
 4922  2441304   3312 perl leak.pl
 # constant

操作系统默认v5.18.2

$ perl leak.pl
version: v5.18.2 (/usr/bin/perl) PID: 5718
#the ps constant
 5718  2455608   3612 perl leak.pl
 5718  2457656   3636 perl leak.pl
 ...
 5718  2457656   3636 perl leak.pl

pleenv 5.24.0

$ perl leak.pl
version: v5.24.0 (/opt/anyenv/envs/plenv/versions/5.24.0/bin/perl5.24.0) PID: 6342
# GROWING
 6342  2458172  10672 perl leak.pl
 6342  2495036  40820 perl leak.pl
 6342  2526784  70984 perl leak.pl
 6342  2547268 101492 perl leak.pl
 6342  2579012 132380 perl leak.pl
 6342  2600516 163320 perl leak.pl
 6342  2639432 193636 perl leak.pl
 6342  2669128 223836 perl leak.pl
 6342  2700872 254012 perl leak.pl
 6342  2738760 284400 perl leak.pl
 6342  2768456 314256 perl leak.pl
 6342  2789960 344668 perl leak.pl

pleenv 5.24.1

$ perl leak.pl
version: v5.24.1 (/opt/anyenv/envs/plenv/versions/5.24.1/bin/perl5.24.1) PID: 6518
#GROWING
 6518  2466296  23968 perl leak.pl
 6518  2504188  51404 perl leak.pl
 6518  2523644  78616 perl leak.pl
 6518  2560512 105832 perl leak.pl
 6518  2597376 133460 perl leak.pl
 6518  2617856 160496 perl leak.pl
 6518  2643460 187020 perl leak.pl
 6518  2672132 214760 perl leak.pl
 6518  2707972 241532 perl leak.pl
 6518  2743812 269120 perl leak.pl
 6518  2778628 296564 perl leak.pl
 6518  2798084 323252 perl leak.pl
 6518  2825732 350136 perl leak.pl

pleenv 5.25.10

$ perl leak.pl
version: v5.25.10 (/opt/anyenv/envs/plenv/versions/5.25.10/bin/perl5.25.10) PID: 6732
# perl adjusted few times the memory - but steady constant
 6732  2445952   3760 perl leak.pl
 6732  2445952   3760 perl leak.pl
 6732  2446976   3772 perl leak.pl
 6732  2448000   3784 perl leak.pl
 6732  2448000   3784 perl leak.pl
 6732  2448000   3784 perl leak.pl
 6732  2448000   3784 perl leak.pl
 6732  2450048   3808 perl leak.pl
 6732  2450048   3812 perl leak.pl
 6732  2450048   3812 perl leak.pl
 6732  2450048   3812 perl leak.pl
 6732  2450048   3812 perl leak.pl
 6732  2450048   3812 perl leak.pl
 ...
 6732  2450048   3812 perl leak.pl

【讨论】:

  • 谢谢,成功了。我也在 5.22.1 和 5.22.2 上进行了测试,没有泄漏。我也会尝试尝试 5.25,但就是这样!感谢您的帮助,也感谢您进行彻底的测试,非常感谢! :)
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 2013-10-07
  • 2021-08-16
  • 2017-08-19
  • 2012-03-06
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多