Windows 2003 Server で ActiveState Perl 5.6 を使用していますが、メモリ リークの問題が発生しています。それらを見つけるのに役立つ良いツール(または手がかりを与える悪いツール)はありますか?
3 に答える
すべての perl プログラムのメモリ リークは、XS が参照を保持しているか、循環データ構造のいずれかになります。Devel::Cycleは、どの構造がループを含む可能性が高いかを知っている場合、循環参照を見つけるための優れたツールです。Devel::Peekを使用すると、参照カウントが予想よりも多いオブジェクトを見つけることができます。
他にどこを見ればよいかわからない場合は、Devel::LeakTrace::Fastが最初の場所として適切かもしれませんが、デバッグ用に構築された perl が必要です。
リークが XS 空間内にあると疑われる場合、それははるかに困難であり、おそらくValgrindが最善の策です。Test::Valgrindは、検索する必要のあるコードの量を減らすのに役立つかもしれませんが、これは Windows では機能しないため、これを行うには (少なくとも漏れのある部分を) Linux に移植する必要があります。
Devel::Gladiatorは、任意の時点で Perl がメモリ内に持っている各変数の型の数と、それらが何を参照しているかのリストを表示します。作成されているが解放されていないオブジェクトのタイプを把握するのに非常に役立ちます。
まだ言及されていないので、Devel::Sizeはデータ構造のサイズを報告します。与えられた他の情報はなく、データ構造の「境界」を決定するために使用するルールは不透明です。単純な構造の場合、これは問題ではありません。
Devel::SizeMeは私の趣味のプロジェクトで、Devel::Size の問題を解決し、perl インタープリターのメモリ使用量全体を可視化することを目的としています。スクリーンキャストやビデオへのリンクなど、追加情報については私のブログを参照してください。私の目標の 1 つは、リークの検出と可視化を可能にすることですが、それはまだ先の話です。
アップデート:
他のコメントに加えて、LPW2013 での私のPerl メモリ使用に関する講演が役に立つかもしれません。スライドを説明し、最後にいくつかのかわいいビジュアルといくつかの Q&A があるので、スクリーンキャストを見ることをお勧めします。
また、講演で言及したPaul Evans Devel::MATモジュールも参照することをお勧めします。