MALLINFO

Section: Linux Programmer's Manual (3)
Updated: 2020-11-01
Index JM Home Page roff page
 

名前

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 safetyMT-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/ に書かれている。


 

Index

名前
書式
説明
属性
準拠
バグ
プログラムのソース
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 11:55:23 GMT, May 01, 2021