Tot*_*tor 4 linux process memory
我知道如果一个进程做了一个malloc()但实际上并没有在这个内存上写,Linux 会认为这个内存是空闲的并且可以被其他进程使用(过度使用)。
无论如何,有没有办法知道malloc()给定进程占用了多少内存?(即使没有使用)
此信息存在于 中的系统范围内/proc/meminfo,但我想知道特定过程。
我挖了进去,/proc/<PID>/{smaps,stat,statm}但我不确定它是否显示了这些信息。
malloc()导致数据段大小改变的调用(即,不重用以前分配的内存——因此导致调用sbrk()或 的分配mmap())显示在/proc/$PID/statm和 中/proc/$PID/stat。
在 中statm,第一个字段显示程序总大小,第六个字段显示数据页数;这两者都反映了内存分配(即使未使用)。
在 中stat,要查看的字段是vsize(当前的第 23 个字段)。
(请参阅proc文档中的表 1-3 和 1-4 。)
请注意,这些显示总内存使用量和总数据段大小,因此您无法区分已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;
}
Run Code Online (Sandbox Code Playgroud)
(一如既往地出色的错误处理。)然后
$ ./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
Run Code Online (Sandbox Code Playgroud)
Andrew Henle 指出 malloc_info(3),您实际上可以在几乎任何流程中使用它。使用上面的示例程序,没有任何调试信息(只是为了表明它没有必要):
$ gdb ./356532
> break free
Run Code Online (Sandbox Code Playgroud)
(这会free在程序中的调用处设置一个断点——实际上是对 的任何调用free,但我们将首先点击“我们的”;尝试使用malloc不会那么有用,因为启动代码使用malloc)
> run
Run Code Online (Sandbox Code Playgroud)
当gdb遇到断点时,您可以这样调用malloc_info:
> call malloc_info(0, stdout)
Run Code Online (Sandbox Code Playgroud)
这将转储malloc信息。