Perl は GC に参照カウントを使用するため、誤って循環参照を作成するのは非常に簡単です。私のプログラムがますます多くのメモリを使用しているように見えます。おそらく数日後にはオーバーフローするでしょう。
Perl でメモリ リークをデバッグする方法はありますか? プログラムにアタッチして、さまざまなタイプのオブジェクトの数を取得することは、良い出発点です。どのオブジェクトが予想よりもはるかに多いかを知っていれば、それらへのすべての参照をチェックして、できればリークを修正できます。
Perl は GC に参照カウントを使用するため、誤って循環参照を作成するのは非常に簡単です。私のプログラムがますます多くのメモリを使用しているように見えます。おそらく数日後にはオーバーフローするでしょう。
Perl でメモリ リークをデバッグする方法はありますか? プログラムにアタッチして、さまざまなタイプのオブジェクトの数を取得することは、良い出発点です。どのオブジェクトが予想よりもはるかに多いかを知っていれば、それらへのすべての参照をチェックして、できればリークを修正できます。
Perl がそれ自体でシステムにメモリを返さないことmalloc()
は関連しているかもしれません: それはすべて、それに関連するすべての規則次第です。
がメモリをどのように割り当てるかを知ることmalloc()
は、より大きな質問に答えるために重要であり、システムによって異なりますが、一般に、ほとんどのmalloc()
実装は、スタックのような順序で割り当ておよび割り当て解除するプログラム用に最適化されています。Perl はメモリを追跡するために参照カウントを使用します。これは、(下で使用する GC ベースの言語とは異なり) 解放を意味することを意味し、解放がどこで、どのような順序で発生するかを実際malloc()
に判断することはそれほど難しくありません。
undef($old_object)
C プログラマーが言うのと同様の方法で、明示的に呼び出して、正しい順序で、この事実を利用するようにプログラムを再編成できる可能性があります。free(old_object);
実行時間の長いプログラム (数日、数か月など) の場合、ロード/コピー/ダンプ サイクルがexit() and exec()
大量にある場合は、 を使用してガベージ コレクションを行い、他の方法では実行不可能な場合は、単にデータ構造 ( を使用Storable
) とファイル記述子をパックします。 (使用$^F
) およびexec($0)
- 通常は のように設定された環境変数を使用し、Perl がシステムが返す方法を理解できない小さなチャンクをリークしているという理由だけで、独自のリークがない場合でも、$ENV{EXEC_GC_MODE}
同様のものが必要になる場合があります。 .malloc()
もちろん、コードにリークがある場合は、残りのアドバイスの方が適切です。もともとこの件名に関する別の質問に投稿されていましたが、長時間実行されるプログラムを明示的にカバーしていませんでした。
すべての perl プログラムのメモリ リークは、XS が参照を保持しているか、循環データ構造のいずれかになります。Devel::Cycleは、どの構造がループを含む可能性が高いかを知っている場合、循環参照を見つけるための優れたツールです。Devel::Peekを使用すると、参照カウントが予想よりも多いオブジェクトを見つけることができます。
他にどこを見ればよいかわからない場合は、Devel::LeakTrace::Fastが最初の場所として適切かもしれませんが、デバッグ用に構築された perl が必要です。
リークが XS 空間内にあると疑われる場合、それははるかに困難であり、おそらくValgrindが最善の策です。Test::Valgrindは、検索する必要のあるコードの量を減らすのに役立つかもしれませんが、これは Windows では機能しないため、これを行うには (少なくとも漏れやすい部分を) Linux に移植する必要があります。
Devel::Gladiatorは、この分野におけるもう 1 つの便利なツールです。
cpan モジュールDevel::Cycleが探しているもののようです。コードにいくつかの変更を加える必要がありますが、あまり問題なく参照を見つけるのに役立つはずです。
valgrindは優れた Linux アプリケーションで、実行中のコードのメモリ リークを特定します。Perl コードが Linux で実行される場合は、チェックアウトする必要があります。
他のコメントに加えて、LPW2013 での私のPerl メモリ使用に関する講演が役に立つかもしれません。スライドを説明し、最後にいくつかのかわいいビジュアルといくつかの Q&A があるので、スクリーンキャストを見ることをお勧めします。
また、講演で言及したPaul Evans Devel::MATモジュールも参照することをお勧めします。