多くのプロセスを備えたシステム(Ubuntu)があり、1つ(または複数)にメモリリークがあります。リークのあるプロセスを見つける良い方法はありますか?プロセスの一部はJVMであり、一部はそうではありません。自家製のものもあれば、オープンソースのものもあります。
7 に答える
コマンドを実行できますtop
(非対話的に実行するには、と入力しますtop -b -n 1
)。メモリリークが発生しているアプリケーションを確認するには、次の列を確認してください。
- RPRVT-常駐プライベートアドレススペースのサイズ
- RSHRD-常駐共有アドレス空間のサイズ
- RSIZE-常駐メモリサイズ
- VPRVT-プライベートアドレススペースのサイズ
- VSIZE-合計メモリサイズ
プログラムが長時間にわたってリークする場合、top は実用的ではない可能性があります。かなりの量のメモリがリークするのにかかる時間に応じて、「ps aux」の結果を X 秒ごとにファイルに追加する単純なシェル スクリプトを作成します。何かのようなもの:
while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
top のより良い代替手段として、htop の使用をお勧めします。
top に加えて、システム モニターを使用できます (システム - 管理 - システム モニターを選択し、[プロセス] タブを選択します)。[表示] - [すべてのプロセス] を選択し、[編集] - [設定] に移動して、[仮想メモリ] 列を有効にします。この列またはメモリ列で並べ替えます
演繹的にできない場合は、Signal Flare のデバッグ パターンを検討してください。1 つのプロセスによって割り当てられるメモリの量を 10 倍に増やします。次に、プログラムを実行します。
メモリ リークの量が同じ場合、そのプロセスはリークの原因ではありません。プロセスを復元し、次のプロセスに同じ変更を加えます。
原因となっているプロセスにヒットすると、メモリ リーク ジャンプ (「シグナル フレア」) のサイズが表示されます。このプロセス内の個別のステートメントの割り当てサイズを選択的に増やすことで、さらに絞り込むことができます。
難しい仕事。私は通常、 Valgrindのようなデバッガー/メモリプロファイラーを取得して、プログラムを1つずつ実行することをお勧めします。遅かれ早かれ、リークするプログラムを見つけて、それをdevloperに伝えるか、自分で修正することができます。
提案されているように、行く方法はvalgrindです。これは、メモリの使用量など、アプリケーションの実行パフォーマンスの多くの側面をチェックするプロファイラーです。
Valgrindを介してアプリケーションを実行すると、mallocで割り当てられたメモリを解放するのを忘れたかどうか、同じメモリを2回解放したかどうかなどを確認できます。