Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all bug

名前

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

書式

       #include <malloc.h>

       struct mallinfo mallinfo(void);

説明

       mallinfo()  関数は、 malloc(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   割り当てた空間の最高点 ("highwater mark")、 つまり、  これまでの中での最大の割り
                 当て量。 このフィールドはスレッド化されていない環境でのみ収集される。

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

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

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

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

準拠

       この関数は  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 "tlpi_hdr.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)
               usageErr("%s num-blocks block-size [free-step [start-free "
                       "[end-free]]]\n", argv[0]);

           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)
                   fatal("Too many allocations");

               alloc[j] = malloc(blockSize);
               if (alloc[j] == NULL)
                   errExit("malloc");
           }

           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)

この文書について

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