【发布时间】: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