[英]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.