MALLOC_INFO - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
malloc_info-将malloc状态导出到流
语法
#include <malloc.h> int malloc_info(int options, FILE *stream);
说明
malloc_info()函数导出XML字符串,该字符串描述调用方中内存分配实现的当前状态。该字符串将打印在文件流流上。导出的字符串包含有关所有竞技场的信息(请参阅malloc(3))。
按照当前的实现,选项必须为零。
返回值
成功时,malloc_info()返回0;否则,返回0。如果出错,则返回-1,并设置errno以指示原因。
错误说明
- EINVAL
- 选项非零。
版本
malloc_info()已在版本2.10中添加到glibc。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
malloc_info() | Thread safety | MT-Safe |
遵循规范
此函数是GNU扩展。
备注
内存分配信息以XML字符串(而不是C结构)的形式提供,因为该信息可能会随时间变化(根据底层实现的变化)。输出的XML字符串包括版本字段。
open_memstream(3)函数可用于将malloc_info()的输出直接发送到内存中的缓冲区中,而不是发送到文件中。
malloc_info()函数旨在解决malloc_stats(3)和mallinfo(3)中的缺陷。
示例
下面的程序最多包含四个命令行参数,其中前三个是必需的。第一个参数指定程序应创建的线程数。所有线程(包括主线程)均分配第二个参数指定的内存块数。第三个参数控制要分配的块的大小。主线程创建该大小的块,程序创建的第二个线程分配该大小的两倍的块,第三个线程分配该大小的三倍的块,依此类推。
该程序两次调用malloc_info()以显示内存分配状态。第一次调用发生在创建任何线程或分配内存之前。在所有线程分配了内存之后执行第二次调用。
在下面的示例中,命令行参数指定了一个附加线程的创建,并且主线程和附加线程都分配了10000个内存块。分配了内存块之后,malloc_info()显示两个分配区域的状态。
$ getconf GNU_LIBC_VERSION glibc 2.13 $ ./a.out 1 10000 100 ============ Before allocating blocks ============ <malloc version="1"> <heap nr="0"> <sizes> </sizes> <total type="fast" count="0" size="0"/> <total type="rest" count="0" size="0"/> <system type="current" size="135168"/> <system type="max" size="135168"/> <aspace type="total" size="135168"/> <aspace type="mprotect" size="135168"/> </heap> <total type="fast" count="0" size="0"/> <total type="rest" count="0" size="0"/> <system type="current" size="135168"/> <system type="max" size="135168"/> <aspace type="total" size="135168"/> <aspace type="mprotect" size="135168"/> </malloc> ============ After allocating blocks ============ <malloc version="1"> <heap nr="0"> <sizes> </sizes> <total type="fast" count="0" size="0"/> <total type="rest" count="0" size="0"/> <system type="current" size="1081344"/> <system type="max" size="1081344"/> <aspace type="total" size="1081344"/> <aspace type="mprotect" size="1081344"/> </heap> <heap nr="1"> <sizes> </sizes> <total type="fast" count="0" size="0"/> <total type="rest" count="0" size="0"/> <system type="current" size="1032192"/> <system type="max" size="1032192"/> <aspace type="total" size="1032192"/> <aspace type="mprotect" size="1032192"/> </heap> <total type="fast" count="0" size="0"/> <total type="rest" count="0" size="0"/> <system type="current" size="2113536"/> <system type="max" size="2113536"/> <aspace type="total" size="2113536"/> <aspace type="mprotect" size="2113536"/> </malloc>
Program source
#include <unistd.h> #include <stdlib.h> #include <pthread.h> #include <malloc.h> #include <errno.h> static size_t blockSize; static int numThreads, numBlocks; #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) static void * thread_func(void *arg) { int j; int tn = (int) arg; /* The multiplier aq(2 + tn)aq ensures that each thread (including the main thread) allocates a different amount of memory */ for (j = 0; j < numBlocks; j++) if (malloc(blockSize * (2 + tn)) == NULL) errExit("malloc-thread"); sleep(100); /* Sleep until main thread terminates */ return NULL; } int main(int argc, char *argv[]) { int j, tn, sleepTime; pthread_t *thr; if (argc < 4) { fprintf(stderr, "%s num-threads num-blocks block-size [sleep-time]\n", argv[0]); exit(EXIT_FAILURE); } numThreads = atoi(argv[1]); numBlocks = atoi(argv[2]); blockSize = atoi(argv[3]); sleepTime = (argc > 4) ? atoi(argv[4]) : 0; thr = calloc(numThreads, sizeof(pthread_t)); if (thr == NULL) errExit("calloc"); printf("============ Before allocating blocks ============\n"); malloc_info(0, stdout); /* Create threads that allocate different amounts of memory */ for (tn = 0; tn < numThreads; tn++) { errno = pthread_create(&thr[tn], NULL, thread_func, (void *) tn); if (errno != 0) errExit("pthread_create"); /* If we add a sleep interval after the start-up of each thread, the threads likely wonaqt contend for malloc mutexes, and therefore additional arenas wonaqt be allocated (see malloc(3)). */ if (sleepTime > 0) sleep(sleepTime); } /* The main thread also allocates some memory */ for (j = 0; j < numBlocks; j++) if (malloc(blockSize) == NULL) errExit("malloc"); sleep(2); /* Give all threads a chance to complete allocations */ printf("\n============ After allocating blocks ============\n"); malloc_info(0, stdout); exit(EXIT_SUCCESS); }
另外参见
mallinfo(3),malloc(3),malloc_stats(3),mallopt(3),open_memstream(3)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。