簡體   English   中英

Perl線程中的內存泄漏(線程不會釋放內存)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM