プロセスがmalloc()
このメモリに実際に書き込まない場合、Linuxはこのメモリが空で他のプロセスで使用できると考えます(オーバーコミット)。
malloc()
与えられたプロセスがどのくらいのメモリを占めているかを知ることができますか? (使用しなくても)
この情報はシステム全体に存在します/proc/meminfo
が、具体的なプロセスについて知りたいです。
掘り下げたが、/proc/<PID>/{smaps,stat,statm}
この情報が表示されるかどうかはわかりません。
答え1
呼び出しmalloc()
はデータセグメントのサイズを変更します(つまりは、以前に割り当てられたメモリを再利用しません。したがって、sbrk()
または)への呼び出しを引き起こした割り当ては、とにmmap()
表示されます。/proc/$PID/statm
/proc/$PID/stat
最初statm
のフィールドにはプログラムの合計サイズが表示され、6番目のフィールドにはデータページの数が表示されます。どちらもメモリ割り当てを反映します(使用されていない場合でも)。
でstat
見ることができるフィールドはvsize
(現在23番目のフィールド)です。
(表1-3および1-4参照proc
文書.)
malloc()
これは合計メモリ使用量と総データセグメントサイズを表示するため、使用されているメモリと他のメモリ使用量を区別することはできません。
次のプログラムを使用して実際にこれを表示できます。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
void *buf;
puts("Waiting before allocating...");
sleep(20);
buf = malloc(10*1024*1024*1024L);
puts("Sleeping after allocating...");
sleep(20);
free(buf);
return 0;
}
(いつもエラー処理は素晴らしいです。)
$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464
アンドリュー・ヘンレ 指摘 malloc_info(3)
、実際にはほぼすべてのプロセスで使用できます。上記のサンプルプログラムを使用すると、デバッグ情報なし(ただ見せる必要はありません):
$ gdb ./356532
> break free
free
(これを行うと、プログラムの呼び出しにブレークポイントが設定されます。実際にはすべての呼び出しがありますが、free
「私たち」を最初に押すことになります。スタートmalloc
コードでを使用するので、これを試すことはあまり役に立ちませんmalloc
。)
> run
gdb
ブレークポイントが発生した場合は、malloc_info
次を呼び出すことができます。
> call malloc_info(0, stdout)
これでmalloc
情報がダンプされます。