线程中的 Perl 内存泄漏(线程不释放内存)



我现在正在搜索这个问题2周,似乎我只在网上搜索中找不到任何答案。

所以,这是两个代码:

1:

#! /usr/bin/perl
#
# RELEASE MEMORY
#
use threads;
my @child;
$ii=0;

while (1)
{
  my @child = threads->new(&test, "test");
  $_->detach for @child;
  print "$iin";
  $ii++;
}
sub test {
    my ($ee) = 0;    
}

2:

#! /usr/bin/perl
#
# DO NOT RELEASE MEMORY
#
use threads;
my @child;
$ii=0;

for($ii=0;$ii<2000;$ii++) {
    my @child = threads->new(&test, "test");
    $_->detach for @child;
    print "$iin";
}
while(1)
{
  sleep(10);
}
sub test {
    my ($ee) = 0;    
}

所以这是问题。第一个代码仅运行一个无限循环,它将内存释放回操作系统,每2秒钟(根据PS)

第二个代码也释放了内存,但只有当他在" for"循环中运行时。一旦退出for循环并输入无限循环,所有未释放到for循环的内存都永远不会释放回操作系统。

有人遇到同样的问题吗?

perl:(v5.16.1)为x86_64-linux-thread-multi

构建

OS:Debian 6.0.5

非常感谢


编辑1:我使用了800个线程,所有这些线程都通过打印$ eevar。

来证实它们退出

但是一旦进入时(1)循环,这是PS Aux |GREP PERL输出:

root@srv:~# ps aux | grep perl
root      6807 41.5  2.5 387780 209580 pts/0   S+   16:38   0:02 /opt/ActivePerl-5.16/bin/perl /home/tttlast.pl
root      7627  0.0  0.0   7548   856 pts/1    S+   16:38   0:00 grep perl

因此,所有线程都退出了,但内存使用率仍然是我的服务器总内存的2.5%。因此,除非我杀死程序,否则存储器仍在使用中。


编辑2:

我解决了问题,我改变了结构。实际上,主要程序(长期运行一个)已经分开,我使用的小程序会等待所有线程退出。

这样,它不满意虚拟记忆,其他守护程序没有被杀死。

感谢每个人带领我解决该解决方案。

这里没有"问题"。这都是正常的,预期的行为。如果这引起了您的某种问题,那么您没有解释它是什么。

没有理由将虚拟内存返回操作系统,因为虚拟内存不是稀缺的资源。没有理由将物理内存返回操作系统,因为操作系统无论如何都有更好的使用。

没有证据表明这是记忆泄漏。测试结果表明,在没有限制的情况下,在没有任何情况下增加内存的情况 - 在所有情况下,它最终都取消了。

最新更新