查看 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信息。

相关内容