繁体   English   中英

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

[英]Perl memory leak in threads (threads don't release memory)

我现在正在搜索有关该问题的两个星期,似乎仅在网络上搜索就找不到任何答案。

因此,这是两段代码:

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;    
}

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;    
}

这就是问题所在。 第一个代码仅运行一个无限循环,并且大约每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

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


编辑2:

我解决了问题,改变了结构。 实际上,主程序(长时间运行的程序)已被分离,我使用的是小程序,它们等待所有线程退出。

这样,它不会充满虚拟内存,其他守护程序也不会被杀死。

感谢每个人将我引向该解决方案。

这里没有“问题”。 这是所有正常的预期行为。 如果这导致您遇到某种问题,则无需说明它是什么。

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

没有证据表明这是内存泄漏。 测试结果表明,在任何情况下都不会出现内存使用无限增加的情况-在所有情况下,内存使用情况最终都会趋于平稳。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM