我现在正在搜索这个问题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:
我解决了问题,我改变了结构。实际上,主要程序(长期运行一个)已经分开,我使用的小程序会等待所有线程退出。
这样,它不满意虚拟记忆,其他守护程序没有被杀死。
感谢每个人带领我解决该解决方案。
这里没有"问题"。这都是正常的,预期的行为。如果这引起了您的某种问题,那么您没有解释它是什么。
没有理由将虚拟内存返回操作系统,因为虚拟内存不是稀缺的资源。没有理由将物理内存返回操作系统,因为操作系统无论如何都有更好的使用。
没有证据表明这是记忆泄漏。测试结果表明,在没有限制的情况下,在没有任何情况下增加内存的情况 - 在所有情况下,它最终都取消了。