8

私は現在、この問題について2週間検索していますが、Webで検索しただけでは答えが見つからないようです。

したがって、ここに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;    
}

これが問題です。最初のコードは1つの無限ループのみを実行し、約2秒ごとにメモリをオペレーティングシステムに解放します(psによる)

2番目のコードもメモリを解放していますが、これは彼が「for」ループ内で実行している場合のみです。forループを終了して無限ループに入ると、forループに解放されていないすべてのメモリがオペレーティングシステムに解放されることはありません。

同じ問題が発生している人はいますか?

Perl:(v5.16.1)x86_64-linux-thread-multi用に構築

OS:Debian 6.0.5

どうもありがとう


編集1:800スレッドを使用し、$ee変数を出力してスレッドが終了することをすべて確認しました。

しかし、while(1)ループに入ると、ここにpsaux|があります。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:

問題を解決し、構造を変更しました。実際、メインプログラム(長時間実行されているプログラム)は分離されており、すべてのスレッドが終了するまで待機する小さなプログラムを使用しています。

このように、仮想メモリがいっぱいになることはなく、他のデーモンが強制終了されることもありません。

その解決策に私を導いてくれたすべての人に感謝します。

4

1 に答える 1

4

ここには「問題」はありません。これはすべて正常な、予想される動作です。これが何らかの問題を引き起こしている場合、あなたはそれが何であるかを説明していません。

仮想メモリは希少なリソースではないため、仮想メモリをオペレーティングシステムに戻す理由はありません。物理メモリをオペレーティングシステムに戻す理由はありません。とにかく、オペレーティングシステムがそれをより適切に使用できる場合は、オペレーティングシステムがそれを取得するからです。

それがメモリリークであるという証拠はありません。テスト結果は、メモリ使用量が際限なく増加するケースはないことを示唆しています。すべての場合において、最終的には横ばいになります。

于 2012-10-22T23:25:34.157 に答える