Linux で 'top' を使用して 1 つのプロセスのメモリを表示する理由は、すべてのプロセスを閉じない限り、プロセスのストレージが増加するだけで減少しないことがわかります。 'malloc' の後ろのみ。プロセスの正確な実際の REAL-TIME ストレージを取得するにはどうすればよいですか? 皆さんありがとう。
5 に答える
pidを見つけ、同じユーザーとして実行している場合は「ps aux」を使用し、そうでない場合は「ps ax」を使用して、次のコマンドを実行します。
cat /proc/<PID>/status
これはあなたが知りたいすべてであるはずです。
簡単に言えば、最新のオペレーティング システムではこれは非常に難しいということです。
free() されたメモリは、プロセスが終了するまで実際には OS に返されないため、メモリのチャンクを徐々に割り当てて解放するサイクルが何度も繰り返されると、プロセスが大きくなります。(経由)
この質問は、別の SO スレッドですでに詳細に回答されています。そこにあなたの答えが見つかるかもしれません。
割り当てのサイズに応じて、メモリが OS に返される場合と返されない場合があります。大きなもの ( を参照)MMAP_THRESHOLD
を割り当てている場合malloc(3)
、メモリの多くのページを必要とするものでは、glibc は割り当てにmmap(2)
のMAP_ANONYMOUS
フラグを使用します。free(3)
このオブジェクトを使用すると、glibc はページを OS に返すことができ、メモリ使用量が減少します。
MMAP_THRESHOLD
必要に応じて を使用して調整できmallopt(3)
ます。
より小さな割り当てが多数ある場合、メモリが十分に断片化free(3)
されている可能性があり、OS に返すことができるページ全体を実際に解放することはできません。特定のページでの使用は比較的少ないかもしれませんが、ページ全体がプロセスに割り当てられ、他のプロセスからのページ全体のデータが置き換えられます。
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-- /lib/libdl-2.5.so
0034d000 4K rx-- /lib/libdl-2.5.so
0034e000 4K rwx-- /lib/libdl-2.5.so
006f2000 236K 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
08050000 4K rw --- /sbin/init
09c0f000 132K rw--- [アノン]
b7fed000 8K rw--- [アノン]
bfd87000 84K rw--- [スタック]
合計 2040K