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

use*_*742 8 perl multithreading memory-leaks

我现在正在寻找关于这个问题的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 "$ii\n";
  $ii++;
}

sub test {
    my ($ee) = 0;    
}
Run Code Online (Sandbox Code Playgroud)

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 "$ii\n";
}

while(1)
{
  sleep(10);
}

sub test {
    my ($ee) = 0;    
}
Run Code Online (Sandbox Code Playgroud)

所以这就是问题所在.第一个代码只运行一个无限循环,并且每2秒钟将内存释放回操作系统(根据ps)

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

有人遇到同样的问题吗?

Perl:(v5.16.1)为x86_64-linux-thread-multi构建

操作系统:Debian 6.0.5

非常感谢


编辑1:我使用了800个线程,并且都通过打印$ ee var来验证它们是否已退出.

但是一旦进入while(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
Run Code Online (Sandbox Code Playgroud)

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


编辑2:

我解决了我的问题,改变了我的结构.事实上,主程序(长期运行的程序)已经分离,我使用小程序,在所有线程完成退出之前等待.

这种方式它没有充满虚拟内存,其他守护进程也没有被杀死.

感谢大家带领我找到解决方案.

Dav*_*rtz 4

这里不存在“问题”。这都是正常的、预期的行为。如果这给您带来了某种问题,那么您还没有解释它是什么。

没有理由将虚拟内存返回给操作系统,因为虚拟内存不是稀缺资源。没有理由将物理内存返回给操作系统,因为如果操作系统有更好的用途,它就会占用它。

没有证据表明这是内存泄漏。测试结果表明,内存使用量不会无限制地增加——在所有情况下,内存使用量最终都会趋于平稳。