私は現在、この問題について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:
問題を解決し、構造を変更しました。実際、メインプログラム(長時間実行されているプログラム)は分離されており、すべてのスレッドが終了するまで待機する小さなプログラムを使用しています。
このように、仮想メモリがいっぱいになることはなく、他のデーモンが強制終了されることもありません。
その解決策に私を導いてくれたすべての人に感謝します。