MALLINFO - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
mallinfo-获取内存分配信息
语法
#包括
struct mallinfo mallinfo(无效);
说明
mallinfo()函数返回包含有关malloc(3)和相关函数执行的内存分配信息的结构的副本。
注意,并非所有分配都对mallinfo()可见;请参阅BUGS,并考虑改用malloc_info(3)。
返回的结构定义如下:
struct mallinfo { int arena; /* Non-mmapped space allocated (bytes) */ int ordblks; /* Number of free chunks */ int smblks; /* Number of free fastbin blocks */ int hblks; /* Number of mmapped regions */ int hblkhd; /* Space allocated in mmapped regions (bytes) */ int usmblks; /* Maximum total allocated space (bytes) */ int fsmblks; /* Space in freed fastbin blocks (bytes) */ int uordblks; /* Total allocated space (bytes) */ int fordblks; /* Total free space (bytes) */ int keepcost; /* Top-most, releasable space (bytes) */ };
mallinfo结构的字段包含以下信息:
- arena
- 通过mmap(2)以外的方式分配的内存总量(即,在堆上分配的内存)。该图包括使用中的块和空闲列表中的块。
- ordblks
- 普通(即非fastbin)空闲块的数量。
- smblks
- Fastbin空闲块的数量(请参阅mallopt(3))。
- hblks
- 当前使用mmap(2)分配的块数。 (请参阅mallopt(3)中有关M_MMAP_THRESHOLD的讨论。)
- hblkhd
- 当前使用mmap(2)分配的块中的字节数。
- usmblks
- 分配空间的"高水位标记",即已分配的最大空间量。此字段仅在非线程环境中维护。
- fsmblks
- fastbin空闲块中的字节总数。
- uordblks
- 使用中的分配所使用的字节总数。
- fordblks
- 空闲块中的字节总数。
- keepcost
- 堆顶部的可释放可用空间总量。这是malloc_trim(3)理想情况下可以释放的最大字节数(即,忽略页面对齐限制等)。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
mallinfo() | Thread safety | MT-Unsafe init const:mallopt |
mallinfo()将访问一些全局内部对象。如果非原子地修改它们,可能会导致不一致的结果。 const:mallopt中的Mallall标识符表示mallopt()将使用原子来修改全局内部对象,以确保mallinfo()足够安全,而其他人则可能非原子地进行修改。
遵循规范
POSIX或C标准未指定此功能。许多System V派生类中都存在类似的功能,并且在SVID中进行了指定。
BUGS
仅返回主内存分配区域的信息。排除了其他领域的分配。有关包含有关其他竞技场信息的替代方法,请参见malloc_stats(3)和malloc_info(3)。
mallinfo结构的字段键入为int。但是,由于某些内部簿记值的类型可能很长,因此报告的值可能会绕零,因此不准确。
示例
下面的程序使用mallinfo()在分配和释放一些内存块之前和之后检索内存分配统计信息。统计信息显示在标准输出上。
前两个命令行参数指定要通过malloc(3)分配的块的数量和大小。
其余三个参数指定应使用free(3)释放哪个已分配的块。这三个参数是可选的,并按顺序指定:在释放块的循环中使用的步长(默认为1,意味着释放范围内的所有块);要释放的第一个块的顺序位置(默认为0,表示第一个分配的块);一个数字,它比要释放的最后一个块的顺序位置大(默认值比最大块数大一个)。如果忽略这三个参数,则默认值将释放所有分配的块。
在以下程序运行示例中,执行了1000个100字节的分配,然后释放了第二个分配的块:
$ ./a.out 1000 100 2 ============== Before allocating blocks ============== Total non-mmapped bytes (arena): 0 # of free chunks (ordblks): 1 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 0 Total free space (fordblks): 0 Topmost releasable block (keepcost): 0 ============== After allocating blocks ============== Total non-mmapped bytes (arena): 135168 # of free chunks (ordblks): 1 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 104000 Total free space (fordblks): 31168 Topmost releasable block (keepcost): 31168 ============== After freeing blocks ============== Total non-mmapped bytes (arena): 135168 # of free chunks (ordblks): 501 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 52000 Total free space (fordblks): 83168 Topmost releasable block (keepcost): 31168
Program source
#include <malloc.h> #include <stdlib.h> #include <string.h> static void display_mallinfo(void) { struct mallinfo mi; mi = mallinfo(); printf("Total non-mmapped bytes (arena): %d\n", mi.arena); printf("# of free chunks (ordblks): %d\n", mi.ordblks); printf("# of free fastbin blocks (smblks): %d\n", mi.smblks); printf("# of mapped regions (hblks): %d\n", mi.hblks); printf("Bytes in mapped regions (hblkhd): %d\n", mi.hblkhd); printf("Max. total allocated space (usmblks): %d\n", mi.usmblks); printf("Free bytes held in fastbins (fsmblks): %d\n", mi.fsmblks); printf("Total allocated space (uordblks): %d\n", mi.uordblks); printf("Total free space (fordblks): %d\n", mi.fordblks); printf("Topmost releasable block (keepcost): %d\n", mi.keepcost); } int main(int argc, char *argv[]) { #define MAX_ALLOCS 2000000 char *alloc[MAX_ALLOCS]; int numBlocks, j, freeBegin, freeEnd, freeStep; size_t blockSize; if (argc < 3 || strcmp(argv[1], "--help") == 0) { fprintf(stderr, "%s num-blocks block-size [free-step " "[start-free [end-free]]]\n", argv[0]); exit(EXIT_FAILURE); } numBlocks = atoi(argv[1]); blockSize = atoi(argv[2]); freeStep = (argc > 3) ? atoi(argv[3]) : 1; freeBegin = (argc > 4) ? atoi(argv[4]) : 0; freeEnd = (argc > 5) ? atoi(argv[5]) : numBlocks; printf("============== Before allocating blocks ==============\n"); display_mallinfo(); for (j = 0; j < numBlocks; j++) { if (numBlocks >= MAX_ALLOCS) { fprintf(stderr, "Too many allocations\n"); exit(EXIT_FAILURE); } alloc[j] = malloc(blockSize); if (alloc[j] == NULL) { perror("malloc"); exit(EXIT_FAILURE); } } printf("\n============== After allocating blocks ==============\n"); display_mallinfo(); for (j = freeBegin; j < freeEnd; j += freeStep) free(alloc[j]); printf("\n============== After freeing blocks ==============\n"); display_mallinfo(); exit(EXIT_SUCCESS); }
另外参见
mmap(2),malloc(3),malloc_info(3),malloc_stats(3),malloc_trim(3),mallopt(3)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。