実行中のプロセス内で、自分のメモリ使用量を取得する方法。
Linux, macOS についてそれぞれ。
Linux
Linux でよくやられるのは /proc 以下を見にいく方法でしょうか。
/proc/[pid]/status, /proc/[pid]/statm から取得できます。
[pid] は process ID で getpid()[unistd.h] で取得できます。
前者は人間が読みやすい形式ですが、プログラムで読むなら後者がラクだと思います。
/proc/[pid]/status
- VmPeak : 仮想メモリサイズのピーク値
- VmSize : 現在の仮想メモリサイズ
- VmHWM : 実メモリ使用量のピーク値(High Water Mark)
- VmRSS : 現在の実メモリ使用量(Resident Set Size)
/proc/[pid]/statm
7つの数字が列挙されていて、そのうち前から3つが
仮想メモリ、実メモリ、共有メモリ使用量。
単位がページ数なので getpagesize()[unistd.h] を掛ければ byte単位になる。
macOS
さて、ここからがこの記事のきっかけ。
元は上記のように /proc 以下を見に行っていた Linux用のコードを
macOS に移植しようとしたら /proc なんて無かった。。。という訳で調べてみた。
構造体 task_basic_info が virtual_size, resident_size (unit: byte) を持っていて、
他にも user_time や system_time なんかも持っているので、
例えば以下のような感じに task_info(...) 関数で task_basic_info を詰めてもらう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ifdef __APPLE__ #include "mach/mach.h" #endif ... #ifdef __APPLE__ struct task_basic_info taskBasicInfo; mach_msg_type_number_t taskInfoCount = TASK_BASIC_INFO_COUNT; if (task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&taskBasicInfo, &taskInfoCount)!= KERN_SUCCESS){ // Error!! return; } vm_size_t VmSize=taskBasicInfo.virtual_size; vm_size_t VmRSS=taskBasicInfo.resident_size; ... #else // Linux用の /proc/[pid]/statm の処理など ... #endif |
macOS でどうやって共有メモリサイズを取得できるのかは良く分からなかった。。。