web-dev-qa-db-ja.com

どのプロセスがメモリをリークしているかをどのように見つけるのですか

システム(Ubuntu)に多くのプロセスがあり、1つ(またはそれ以上)にメモリリークがあります。リークのあるプロセスを見つける良い方法はありますか?プロセスの一部はJVMであり、一部はそうではありません。一部は自家栽培で、一部はオープンソースです。

25
Udi

topコマンドを実行できます(非対話的に実行するには、top -b -n 1)。メモリをリークしているアプリケーションを確認するには、次の列を見てください。

  • RPRVT-常駐プライベートアドレススペースサイズ
  • RSHRD-常駐共有アドレス空間サイズ
  • RSIZE-常駐メモリサイズ
  • VPRVT-プライベートアドレススペースのサイズ
  • VSIZE-合計メモリサイズ
14
Adam Rosenfield

プログラムが長時間にわたってリークする場合、topは実用的ではない可能性があります。大量のメモリリークにかかる時間に応じて、X秒ごとに「ps aux」の結果をファイルに追加する単純なシェルスクリプトを作成します。何かのようなもの:

while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
9
Dprado

トップに加えて、システムモニターを使用できます([システム]-[管理]-[システムモニター]、[プロセス]タブを選択)。 [表示]-[すべてのプロセス]を選択し、[編集]-[設定]に移動して、[仮想メモリ]列を有効にします。この列、またはメモリ列でソートします

5
dmityugov

Topの代わりとしてhtopを使用することをお勧めします。

難しいタスク。通常、 Valgrind のようなデバッガー/メモリプロファイラーを取得し、プログラムを1つずつ実行することをお勧めします。遅かれ早かれ、リークするプログラムが見つかり、開発者に伝えるか、自分で修正することができます。

4
unexist

演ductive的にできない場合は、Signal Flareのデバッグパターンを検討してください。1つのプロセスによって割り当てられるメモリの量を10倍にします。次に、プログラムを実行します。

リークされたメモリの量が同じ場合、そのプロセスはリークの原因ではありませんでした。プロセスを復元し、次のプロセスに同じ変更を加えます。

責任のあるプロセスに到達すると、メモリリークジャンプ(「信号フレア」)のサイズが表示されます。このプロセス内の個別のステートメントの割り当てサイズを選択的に増やすことにより、さらに絞り込むことができます。

3
user20493

提案されているように、行く方法は無謀です。これは、メモリの使用など、アプリケーションの実行パフォーマンスの多くの側面をチェックするプロファイラーです。

Valgrindを介してアプリケーションを実行すると、mallocで割り当てられたメモリを解放するのを忘れた場合、同じメモリを2回解放した場合などを確認できます。

3
Remo.D