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

标签 multithreading perl memory-leaks

我现在就这个问题搜索了 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:

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

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

感谢所有引导我找到该解决方案的人。

最佳答案

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

没有理由将虚拟内存归还给操作系统,因为虚拟内存不是稀缺资源。没有理由将物理内存返还给操作系统,因为如果它有更好的用途,操作系统就会使用它。

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

关于multithreading - 线程中的 Perl 内存泄漏(线程不释放内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990085/

相关文章:

memory-management - 使用道场后如何清理?

c++ - C++程序中的内存泄漏

memory-leaks - GenServer 进程的内存泄漏

python - 从另一个线程检查主线程是否还活着

java - 文本横幅小程序反转显示文本

c++ - 从外部对象调用方法时,qt 的 gui 线程是否会在后台生成线程?

regex - grep和perl regex之间的区别?

ios - TableView Segue 到新 ViewController 不能工作两次

perl 对日期时间字符串的多个 arryref 进行排序

珀尔泰克斯 : How to output to a latexfile?