我现在正在寻找关于这个问题的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;
}
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:
我解决了我的问题,改变了我的结构。事实上,主程序(长时间运行的程序)已经分离,我使用小程序,在所有线程完成退出之前等待。
这样它就不会填满虚拟内存而其他守护进程也不会被杀死。
感谢大家带领我找到解决方案。
答案 0 :(得分:4)
这里没有“问题”。这都是正常的预期行为。如果这导致你出现某种问题,你就没有解释它是什么。
没有理由将虚拟内存返回给操作系统,因为虚拟内存不是稀缺资源。没有理由将物理内存返回给操作系统,因为操作系统无论如何都会更好地使用它。
没有证据表明内存泄漏。测试结果表明,没有任何情况下内存使用量会无限制地增加 - 在所有情况下,它最终都会降低。