MALLINFO - Linux手册页

时间:2019-08-20 18:00:50  来源:igfitidea点击:

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)。

InterfaceAttributeValue
mallinfo()Thread safetyMT-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/