2012-05-02 7 views
3
に一つのプロセスのメモリを取得することができます

可能性の重複:
Linux: How to measure actual memory usage of an application or process?どのように私はLinuxの

私は1つのプロセスの私の記憶を示すために、Linuxでの「トップ」を使用して、なぜ、私を得ますプロセスのストレージは増加するだけで、すべてのプロセスを終了する以外は減少しません。私は 'malloc'の後ろに 'free'を使用していますが、理由はわかりません。 プロセスの正しい実際のリアルタイム記憶域を取得するにはどうすればよいですか?ありがとうございます。

+0

あなたがそのプロセスまたはシェルコマンドを介して行うことができ、あなたのプログラム内からCのAPIを経由して、そのプロセスのメモリ使用量を取得したいですか? –

+0

私はいくつかのアクションを取ると、私のCプロセスがOSのストレージをますます増やしていることをシェルコマンド 'top'から取得しています。 – keyoflov

+0

これはコメントでなければならないと思います。 –

答えて

4

短い答えは、最新のオペレーティングシステムではこれは非常に難しいということです。無料()されている

メモリはプロセスが終了するまで、実際にそう を割り当て、メモリの漸進的により大きなチャンクを解放する多くのサイクルが プロセスが成長するようになります、OS に戻っていないです。 (via

This question has been already answered in more detail on another SO thread.あなたの回答が見つかります。

1

割り当てのサイズによっては、メモリがOSに返される場合と返されない場合があります。 大きいサイズのMMAP_THRESHOLDmalloc(3)を参照)を割り当てている場合、メモリの多くのページを占めるものは、glibcは割り当てのためにmmap(2)MAP_ANONYMOUSフラグを使用します。 free(3)このオブジェクトを使用すると、glibcはページをOSに戻すことができ、メモリ使用量は低下します。

MMAP_THRESHOLDを調整する場合は、mallopt(3)を使用してください。あなたは多くの小さな割り当てを持っている場合

、あなたのメモリは、実際にOSに戻すことができ、ページ全体を解放することはできません断片化十分free(3)ている可能性があります。特定のページでを使用すると、が比較的少ないかもしれませんが、ページ全体が依然としてプロセスに対して割り当てられ、他のプロセスのページ全体のデータが置き換えられます。これはuが知りたいすべてでなければなりません

cat /proc/<PID>/status 

:同じユーザーとしての実行中の場合

7

はこれを実行し、そうでない場合は、「PS斧」を使用し、「PSのAUX」を使用し、PIDを見つけます。

0

私はこの他の質問が本当に詳細に答えているとは思わない。

what sarnold saysに加えて、free()には、malloc()のように、特に小さなメモリチャンクの場合と同様に役立ちます。その後、ヒープは最後から縮小することができます...

これを確認するには、テストプログラムで、030の増分でvoid *sbrk(intptr_t increment);を呼び出す必要があります。そして、ヒープの現在の値を通知します。その変化を見るために出力してください。これを正しく、正しく実行すると、glibはbrk()を呼び出してヒープを増やし、最終的に再び縮小する必要があります。

0

あなたがPMAPとidのプロセスを試すことができます。

1: init [3] 

001c3000 100K rx-- /lib/ld-2.5.so

001dc000 4K rx-- /lib/ld-2.5.so

001dd000 4K rwx-- /lib/ld-2.5.so

001e0000 1256K rx-- /lib/libc-2.5.so

0031a000 8K rx-- /lib/libc-2.5.so

0031c000 4K rwx-- /lib/libc-2.5.so

0031d000 12K rwx--【アノン】

0034b000 8K RX -

0034d000 4K rx-- /lib/libdl-2.5.so

0034e000 4K rwx-- /lib/libdl-2.5.so

006f2000 236K /lib/libdl-2.5.so rx-- /lib/libsepol.so.1

0072d000 4K rwx-- /lib/libsepol.so.1

0072e000 40K rwx--【アノン】

0073a000 84K rx-- /lib/libselinux.so.1

0074f000 8K rwx-- /lib/libselinux.so.1

00fff000 4K rx--【アノン】

08048000 32K rx--/sbinに/ INIT

0805万4K RW ---/sbinに/ INIT

09c0f000 132KのRW --- [アノン]

b7fed000 8K RW ---【アノン】

bfd87000 84KのRW --- [スタック]

合計2040K