malloc() を使用して、Linuxでプロセスがどのくらいのメモリを予約しているかを確認します。

malloc() を使用して、Linuxでプロセスがどのくらいのメモリを予約しているかを確認します。

プロセスが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情報がダンプされます。

おすすめ記事