MEMUSAGE - Linux手册页

时间:2019-08-20 17:58:33  来源:igfitidea点击:

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/