查看 Linux 上的進程使用 malloc() 保留了多少內存

查看 Linux 上的進程使用 malloc() 保留了多少內存

我知道如果一個進程做了 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資訊。

相關內容