MEMUSAGE - Linux手册页
Linux用户手册 第1部分
更新日期: 2020-06-09
名称
memusage-程序的配置文件内存使用情况
语法
记忆[选项] ...程序[程序] ...
说明
memusage是一个bash脚本,用于描述程序,程序的内存使用情况。它将libmemusage.so库预加载到调用者的环境中(通过LD_PRELOAD环境变量;请参见ld.so(8))。 libmemusage.so库通过拦截对malloc(3),calloc(3),free(3)和realloc(3)的调用来跟踪内存分配。 (可选)还可以拦截对mmap(2),mremap(2)和munmap(2)的调用。
memusage可以文本形式输出收集的数据,也可以使用memusagestat(1)(请参见下面的-p选项)创建一个PNG文件,其中包含所收集数据的图形表示。
Memory usage summary
memusage输出的"内存使用情况摘要"行包含三个字段:
- heap total
- 所有malloc(3)调用的大小参数的总和,所有calloc(3)调用的参数(nmemb * size)的乘积以及所有mmap(2)调用的长度参数的总和。在realloc(3)和mremap(2)的情况下,如果分配的新大小大于先前的大小,则将所有这些差异的总和(新大小减去旧大小)相加。
- heap peak
- malloc(3)的所有大小参数,calloc(3)的nmemb * size的所有乘积,realloc(3)的所有大小参数,mmap(2)的长度参数以及mremap(2)的new_size参数的最大值。
- stack peak
- 在第一次调用任何受监视的函数之前,将保存堆栈指针地址(基本堆栈指针)。在每个函数调用之后,将读取实际的堆栈指针地址,并计算与基本堆栈指针的差。这些差异的最大值就是堆栈峰值。
在此摘要行之后,立即有一个表格显示每个被拦截函数的调用次数,已分配或已释放的总内存以及失败调用的次数。对于realloc(3)和mremap(2),附加字段" nomove"显示更改了块地址的重新分配,附加" dec"字段显示减小了块大小的重新分配。对于realloc(3),附加字段" free"显示导致块释放的重新分配(即,重新分配的大小为0)。
内存显示的表的"重新分配/总内存"不反映使用realloc(3)重新分配一个内存块以使其具有比以前小的大小的情况。这可能导致所有"总内存"单元格的总和(不包括"空闲")大于"空闲/总内存"单元格。
Histogram for block sizes
"块大小的直方图"提供了将内存分配细分为各种存储桶大小的信息。
选项
- -n name, --progname=name
- 要配置文件的程序文件的名称。
- -p file, --png=file
- 生成PNG图形并将其存储在文件中。
- -d file, --data=file
- 生成二进制数据文件并将其存储在文件中。
- -u, --unbuffered
- 不要缓冲输出。
- -b size, --buffer=size
- 收集大小条目,然后将其写出。
- --no-timer
- 禁用基于计时器的(SIGPROF)堆栈指针值采样。
- -m, --mmap
- 还要跟踪mmap(2),mremap(2)和munmap(2)。
- -?, --help
- 打印帮助并退出。
- --usage
- 打印简短的使用信息并退出。
- -V, --version
- 打印版本信息并退出。
- The following options apply only when generating graphical output:
- -t, --time-based
- 使用时间(而不是函数调用的次数)作为X轴的比例。
- -T, --total
- 还要绘制总内存使用情况的图表。
- --title=name
- 使用名称作为图形的标题。
- -x size, --x-size=size
- 使图形大小像素变宽。
- -y size, --y-size=size
- 使图形大小像素高。
退出状态
退出状态等于已分析程序的退出状态。
BUGS
要报告错误,请参阅
示例
下面是一个简单的程序,该程序以上升到峰值的周期重新分配内存块,然后以较小的块循环地重新分配内存,这些块返回零。编译程序并运行以下命令后,可以在文件memusage.png中找到该程序的内存使用情况图表:
$ memusage --data=memusage.dat ./a.out ... Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224 total calls total memory failed calls malloc| 1 400 0 realloc| 40 44800 0 (nomove:40, dec:19, free:0) calloc| 0 0 0 free| 1 440 Histogram for block sizes: 192-207 1 2% ================ ... 2192-2207 1 2% ================ 2240-2255 2 4% ================================= 2832-2847 2 4% ================================= 3440-3455 2 4% ================================= 4032-4047 2 4% ================================= 4640-4655 2 4% ================================= 5232-5247 2 4% ================================= 5840-5855 2 4% ================================= 6432-6447 1 2% ================ $ memusagestat memusage.dat memusage.png
Program source
#include <stdio.h> #include <stdlib.h> #define CYCLES 20 int main(int argc, char *argv[]) { int i, j; int *p; printf("malloc: %zd\n", sizeof(int) * 100); p = malloc(sizeof(int) * 100); for (i = 0; i < CYCLES; i++) { if (i < CYCLES / 2) j = i; else j--; printf("realloc: %zd\n", sizeof(int) * (j * 50 + 110)); p = realloc(p, sizeof(int) * (j * 50 + 100)); printf("realloc: %zd\n", sizeof(int) * ((j+1) * 150 + 110)); p = realloc(p, sizeof(int) * ((j + 1) * 150 + 110)); } free(p); exit(EXIT_SUCCESS); }
另外参见
memusagestat(1),mtrace(1),ld.so(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。