我知道如果一个进程做了 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
信息。