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

Multithreading 线程中的Perl内存泄漏(线程不释放内存),multithreading,perl,memory-leaks,Multithreading,Perl,Memory Leaks,我现在就这个问题搜索了两周,似乎仅仅在网上搜索就找不到任何答案 下面是两段代码: 1: 2: 因此,所有线程都已退出,但内存使用率仍然是服务器总内存的2.5%。 因此,除非我杀死程序,否则内存仍在使用中 编辑2: 我解决了我的问题,改变了我的结构。事实上,主程序(长时间运行的程序)已经分离,我使用的是在所有线程完成之前等待退出的小程序 这样它就不会填满虚拟内存,其他守护进程也不会被杀死 感谢大家引导我找到解决方案。这里没有“问题”。这都是正常的、预期的行为。如果这给你带来了某种问题,你还没有解

我现在就这个问题搜索了两周,似乎仅仅在网上搜索就找不到任何答案

下面是两段代码:

1:

2:

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


编辑2:

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

这样它就不会填满虚拟内存,其他守护进程也不会被杀死

感谢大家引导我找到解决方案。

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

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


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

我已经在OS X 10.8/Perl 5.16.0上尝试过这些方法。我第一次看到的行为是,在驻留大约6兆字节的几千个线程之后,内存使用量会下降。第二个水平在大约相同的水平,并保持在那里睡觉。显然,在这两种情况下,线程内存都被释放。你能提供更多的证据证明内存没有被释放吗?可能每秒的
ps
输出增加了ps输出。事实上,真正的程序更复杂,只是没有在这里发布,以不被点燃,但它运行了很长时间,每小时打开约250至900个线程,这些线程占我总内存的10%左右,并且从未释放。但这与第二个例子中的方法完全相同。如果您需要更多信息,请告诉我。如果我错了,谢谢纠正我,但是Perl不只是在进程退出时释放内存吗?这是一个长期存在的“特性”,我在最近的perldeltas中找不到任何关于线程优化的证据。我对你声称目睹的内存使用率下降比“泄漏”更为惊讶。。选中
perl-wle'use-Config;打印$Config{usemymalloc}'
。此外,您可以尝试pmap。最后,我不知道
ps
如何处理线程,只是用pmap检查了第一个和第二个脚本,结果相同(第一个是释放内存,第二个是不释放内存)。在这个例子中,我可以只检查线程是否正在运行,当没有人运行时,我会终止并重新启动应用程序,但用我的真实程序,我无法做到这一点。我还检查了perl-wle的use-Config;打印$Config{usemymalloc},它的状态为“n”,可能表示否。因此,如果我没有编译perl以使用malloc,为什么它会从脚本1释放内存,而不是从脚本2释放内存?只是验证了一下,您是对的。当perl程序需要内存时,会占用其他进程使用的内存。事实上,问题是来自perl take内存的其他进程被终止,比如mysql和邮件服务器。perl程序使用mysql和邮件服务器来运行。我应该编辑我的帖子还是发布另一个问题?顺便说一句,谢谢你,你不应该创建这么多线程。这是不明智的。
#! /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;    
}
#! /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;    
}
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