27

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

4

7 に答える 7

15

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

  • RPRVT-常駐プライベートアドレススペースのサイズ
  • RSHRD-常駐共有アドレス空間のサイズ
  • RSIZE-常駐メモリサイズ
  • VPRVT-プライベートアドレススペースのサイズ
  • VSIZE-合計メモリサイズ
于 2008-09-27T15:25:27.003 に答える
9

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

while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
于 2008-09-29T02:28:58.600 に答える
6

top のより良い代替手段として、htop の使用をお勧めします。

于 2008-11-05T14:57:29.507 に答える
5

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

于 2008-09-27T16:56:15.427 に答える
5

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

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

原因となっているプロセスにヒットすると、メモリ リーク ジャンプ (「シグナル フレア」) のサイズが表示されます。このプロセス内の個別のステートメントの割り当てサイズを選択的に増やすことで、さらに絞り込むことができます。

于 2008-09-29T17:33:08.863 に答える
4

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

于 2008-09-27T15:21:33.347 に答える
3

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

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

于 2008-09-27T15:34:54.157 に答える