%20%E4%BF%9D%E7%95%99%E4%BA%86%E5%A4%9A%E5%B0%91%E5%85%A7%E5%AD%98.png)
我知道如果一個進程做了 amalloc()
但實際上沒有在這塊內存上寫入,Linux 會認為這塊內存是空閒的並且可以被其他進程使用(過度使用)。
無論如何,有沒有辦法知道malloc()
給定進程佔用了多少記憶體? (即使沒有使用)
此資訊存在於 的系統範圍內/proc/meminfo
,但我想知道特定的過程。
我深入研究/proc/<PID>/{smaps,stat,statm}
,但不確定它是否顯示此資訊。
答案1
呼叫malloc()
導致資料段大小改變(IE,不會重複使用先前分配的記憶體 - 因此導致呼叫sbrk()
或mmap()
) 的分配會出現在/proc/$PID/statm
和中/proc/$PID/stat
。
其中statm
,第一個欄位顯示程式總大小,第六個欄位顯示資料頁數;這兩者都反映了記憶體分配(即使未使用)。
在 中stat
,要查看的欄位是vsize
(目前第 23 個欄位)。
(參見表 1-3 和 1-4proc
文件.)
請注意,這些顯示了總記憶體使用量和總資料段大小,因此您無法區分已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
資訊。