MALLINFO(3)

名前
mallinfo - メモリー割り当て情報を取得する

書式
#include <malloc.h>

struct mallinfo mallinfo(void);

説明
mallinfo() 関数は、 malloc(3) や一連の関数により実行されたメモリー割り当てに関する情報を格納した構造体のコピーを返す。

Note that not all allocations are visible to mallinfo(); see BUGS and consider using malloc_info(3) instead.

The returned structure is defined as follows:

    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;   /* See below */
        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
    This field is unused, and is always 0. Historically, it was the "highwater mark" for allocated space—that is, the maximum amount of space that was ever allocated (in bytes); this field was maintained only in nonthreading environments.

fsmblks
    fastbin フリーブロックの総バイト数。

uordblks
    使用中の割り当てメモリーで使われているバイト数。

fordblks
    フリーブロックの総バイト数。

keepcost
    ヒープの一番上にある解放可能な未使用の空間の大きさ。 この値は malloc_trim(3) で理想的な場合に解放できる最大のバイト数である (理想的というのは、 ページ境界の制限などを無視した場合である。

属性
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値
mallinfo() | Thread safety | MT-Unsafe init const:mallopt

mallinfo() would access some global internal objects. If modify them with non-atomically, may get inconsistent results. The identifier mallopt in const:mallopt mean that mallopt() would modify the global internal objects with atomics, that make sure mallinfo() is safe enough, others modify with non-atomically maybe not.

準拠
この関数は POSIX や C 標準では規定されていない。 多くの System V 由来のシステムに同様の関数が存在し、 SVID では同様の関数が規定されていた。

バグ
これらの情報はメインのメモリー割り当て領域に対するもののみである。 他の領域の割り当ては対象にならない。 他の領域の情報も取得できる別の手段については malloc_stats(3) や malloc_info(3) を参照。

mallinfo 構造体の各フィールドは int 型である。 しかし、 いくつかの内部管理用の値は long 型の場合もあるので、 報告される値が一周してしまい、 不正確になる可能性がある。

例
以下のプログラムは mallinfo() を利用して、 メモリーブロックの割り当て、解放のそれぞれ前後でメモリー割り当ての統計情報を取得する。 統計情報は標準出力に表示される。

最初の 2 つのコマンドライン引数は malloc(3) で割り当てるブロック数とサイズを指定する。

残りの 3 つの引数は、どの割り当てられたブロックを free(3) で解放すべきかを指定する。 これらの 3 つの引数の指定は任意で、 最初のものから順に以下の情報を指定する。 1 つ目の引数は、 ブロックを解放するループで使用するステップサイズを指定する (デフォルト値は 1 で、 1 は指定した範囲のすべてのブロックを解放することを意味する)。 2 つ目の引数は、 解放する先頭ブロックの場所番号を指定する (デフォルト値は 0 で、 0 は先頭の割り当て済みブロックを意味する)。 3 つ目の引数は、 解放する最終ブロックの場所番号よりひとつ大きい値を指定する (デフォルト値は最大ブロック番号よりもひとつ大きい値である)。 これらの 3 つの引数が省略された場合、 デフォルトではすべての割り当てられたブロックが解放される。

以下のプログラムの実行例では、 100 バイトの割り当てを 1000 回実行し、 割り当てたブロックの 2 つに 1 つを解放する。

    $ ./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

  プログラムのソース
    #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, 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 (int 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 (int 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)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。