日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
JEMALLOC(3) User Manual JEMALLOC(3) 名称 jemalloc - 汎用メモリ割り付け関数 ライブラリ このマニュアルは、jemalloc 4.2.1-0-g3de035335255d553bdb344c32ffdb603816195d8 を説明しています。よ り多くの情報は、jemalloc ウェブサイト[1] で見つけることができます。 次の設定オプションが、libc 組み込み jemalloc で有効にされます: --enable-fill, --enable-lazy-lock, --enable-munmap, --enable-stats, --enable-tcache, --enable-tls, --enable-utrace, and --enable-xmalloc. さらに、--enable-debug は、(MALLOC_PRODUCTION make 変数によって制御され る) FreeBSD の開発バージョンで有効にされます。 書式 #include <stdlib.h> #include <malloc_np.h> 標準 API void *malloc(size_t size); void *calloc(size_t number, size_t size); int posix_memalign(void **ptr, size_t alignment, size_t size); void *aligned_alloc(size_t alignment, size_t size); void *realloc(void *ptr, size_t size); void free(void *ptr); 非標準 API void *mallocx(size_t size, int flags); void *rallocx(void *ptr, size_t size, int flags); size_t xallocx(void *ptr, size_t size, size_t extra, int flags); size_t sallocx(void *ptr, int flags); void dallocx(void *ptr, int flags); void sdallocx(void *ptr, size_t size, int flags); size_t nallocx(size_t size, int flags); int mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen); int mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp); int mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen); void malloc_stats_print(void (*write_cb) (void *, const char *), void *cbopaque, const char *opts); size_t malloc_usable_size(const void *ptr); void (*malloc_message)(void *cbopaque, const char *s); const char *malloc_conf; 解説 標準 API malloc 関数は、size バイトの初期化されていないメモリを割り付けます。割 り付けられた空間は、あらゆるタイプのオブジェクトの記憶域のために (可能 なポインタ強制の後に) 適切に整列されます calloc 関数は、各 size バイトの長さの number 個のオブジェクトのための空 間を割り付けます。割り付けてられたメモリが明示的に 0 バイトに初期化され ることを除いて、number * size の引数で malloc を呼び出すことと結果は、 同一です。 posix_memalign 関数は、割り付けのベースアドレスが alignment の数倍であ るように size バイトのメモリを割り付け、ptr によって指された値に割り付 けを返します。要求された alignment は、少なくとも sizeof(void *) と同じ 大きさの 2 のべき乗でなければなりません。 aligned_alloc 関数は、割り付けのベースアドレスが alignment の数倍である ように size バイトのメモリを割り付けます。要求された alignment は、2 の べき乗でなければなりません。size が alignment の整数倍でないなら、振る 舞いは、未定義です。 realloc 関数は、ptr によって参照される以前に割り付けられたメモリのサイ ズを size バイトに変更します。メモリの内容は、新しいサイズのより小さい 部分と古いサイズの部分は変更されないままです。新しいサイズがより大きい なら、メモリの新しく割り付けられた部分の内容は、未定義です。成功すれ ば、ptr によって参考されるメモリは、解放され、新しく割り付けられたメモ リへのポインタが返されます。realloc は、ptr とは異なっている返り値の結 果となるように、メモリ割り付けを移動するかもしれないことに注意してくだ さい。ptr が NULL であるなら、realloc 関数は、指定されたサイズのための malloc と同じように振る舞います。 free 関数によって、ptr によって参照される割り付けられたメモリは、将来の 割り付けのために利用可能とされます。ptr が NULL であるなら、何もアク ションは、取られません。 非標準 API mallocx, rallocx, xallocx, sallocx, dallocx, sdallocx と nallocx 関数 は、すべて、オプションを指定するために使用することができる flags 引数が あります。関数は、文脈的に適切なオプションであるかのみをチェックしま す。下記の 1 つ以上を指定するためにビット単位の演算子論理和 (|) 演算子 を使用します: MALLOCX_LG_ALIGN(la) (1 << la) の倍数であるアドレスで開始するための整列されたメモリ割り 付け。このマクロは、la が有効な範囲内にあるかを確認しません。 MALLOCX_ALIGN(a) a の倍数であるアドレスで開始するための整列されたメモリ割り付け、こ こで、a は、2 のべき乗です。このマクロは、a 2 のべき乗であるかを確 認しません。 MALLOCX_ZERO 0 バイトを含むように新しく割り付けられたメモリを初期化します。増大 している再割り付けの場合で、再割り付けに先立った実際のサイズは、変 更されていないバイトと 0 バイトを含むように初期化されるもの間の境界 を定義します。このマクロが存在しないなら、新しく割り付けられたメモ リは、初期化されません。 MALLOCX_TCACHE(tc) "tcache.create" mallctl を通して獲得されなければならない識別子 tc によって指定されたスレッド特有のキャッシュ (tcache) を使用します。 このマクロは、有効な識別子を指定する、その tc を有効にしません。 MALLOCX_TCACHE_NONE スレッド特有のキャッシュ (tcache) を使用しません。 MALLOCX_TCACHE(tc) または MALLOCX_TCACHE_NONE が指定されないなら、 自動的に管理された tcache は、多くの状況の下で使用されます。このマ クロは、MALLOCX_TCACHE(tc) として同じ flags 引数で使用することがで きません。 MALLOCX_ARENA(a) インデックス a によって指定されるアリーナを使用します。このマクロに は、指定されたもの以外のアリーナを通して割り付けられた領域のために 効果がありません。このマクロは、a が有効な範囲のアリーナのインデッ クスを指定することを確認しません。 mallocx 関数は、少なくともメモリの size バイトを割り付けて、割り付けの ベースアドレスへのポインタを返します。size が 0 あるなら、振る舞いは、 未定義です。 rallocx 関数は、少なくとも size バイトであるために ptr で割り付けをリサ イズし、そのオリジナルの位置から移動したどうか分からない、結果の割ち付 けのベースアドレスへのポインタを返します。size が 0 あるなら、振る舞い は、未定義です。 xallocx 関数は、少なくとも size バイトであるための位置に ptr で割り付け をリサイズし、割り付けの実際のサイズを返します。extra が 0 でないなら、 少なくとも (size + extra) バイトとなるように割り付けをリサイズ試みが行 われますが、特別の (複数の) バイトを割り付ける能力がないなら、リサイズ の失敗の結果とはなりません。size が 0 0 であるか、または (size + extra > SIZE_T_MAX) であるなら、振る舞いは、未定義です。 sallocx 関数は、ptr で割り付けの実際のサイズを返します。 dallocx 関数によって ptr によって参照されるメモリは、将来の割り付けのた めに利用可能となります。 sdallocx 関数は、呼び出し側が最適化として割り付けサイズに渡することがで きる、size パラメータがある dallocx の拡張です。最小の有効な入力サイズ は、割り付けのオリジナルの要求されたサイズであり、最大の有効な入力サイ ズは、nallocx または sallocx によって返された対応している値です。 nallocx 関数は、メモリを割り付けませんが、それは、mallocx 関数と同じサ イズの計算を行ない、mallocx 関数呼び出しと同等の結果となる割り付けの実 際のサイズを返すか、または入力が、最大のサポートされたサイズのクラスお よび整列を越えているなら、0 を返します。size が 0 であるなら、振る舞い は、未定義です。 mallctl 関数は、設定する修正可能なパラメータと引き金を引くアクションと 同様に、メモリアロケータを内歓するための一般的なインタフェースを提供し ます。ピリオドで区切られた name 引数は、ツリー構造した名前空間の位置を 指定します。ツリーの内容に関する文書については、「MALLCTL 名前空間」セ クションを参照してください。値を読み込むためには、値を含んでいる適切な 空間への oldp を介したポインタと、oldlenp を介した、その長さへのポイン タを渡します。そうでなければ、NULL と NULL を渡します。同様に、値を書き 込むためには、newp を介した値へのポインタと newlen を介したその長さ渡し ます。そうでなければ、NULL と 0 を渡します。 mallctlnametomib 関数は、mallctlbymib に繰り返し渡すことができる "管理 情報ベース" (MIB) に名前を変換することによって、名前空間の同じ部分を繰 り返し問い合わせるアプリケーションのために繰り返された名前の検索を回避 する方法を提供します。mallctlnametomib から成功して返るとき、mibp は、 *miblenp 整数の配列を含んでいます、ここで *miblenp は、name のコンポー ネントの数と *miblenp の入力値のより小さいものです。したがって、完全な MIB を構築するための基本として使用することができる部分的な MIB の結果で ある、ピリオドで区切られた名前のコンポーネントの数より小さい *miblenp を渡すことは可能です。整数である名前コンポーネント (例えば、 "arenas.bin.2.size" の 2) について、対応する MIB のコンポーネントは、常 にその整数になります。したがって、次のようなコードを構築することは正当 です: unsigned nbins, i; size_t mib[4]; size_t len, miblen; len = sizeof(nbins); mallctl("arenas.nbins", &nbins, &len, NULL, 0); miblen = 4; mallctlnametomib("arenas.bin.0.size", mib, &miblen); for (i = 0; i < nbins; i++) { size_t bin_size; mib[2] = i; len = sizeof(bin_size); mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0); /* bin_size で何かを行う... */ } malloc_stats_print 関数は、write_cb コールバック関数ポインタと write_cb に渡された cbopaque データ、または write_cb が NULL であるなら、 malloc_message によって人間に読み込み可能な要約の統計を書き込みます。こ の関数を、繰り返し呼び出すことができます。実行の間に決して変更されない 一般的な情報は、opts 文字列内の文字として "g" を指定することによって省 略することができます。malloc_message は、mallctl* 関数を内部的に使用す るので、複数のスレッドががこれらの関数を同時に使用するなら、一貫性のな い統計値を報告するかもしれないことに注意してください。--enable-stats が、設定の間に指定されるなら、それぞれ、マージされたアリーナとアリーナ ごとの統計を省略するために "m" と "a" を指定することができます。それぞ れ、ビン、大きなオブジェクトと巨大なオブジェクトのためのサイズクラスご との統計を省略するために、"b"、"l" と "h" を指定することができます。訳 注: ビンは、統計用語で、値に従って対象をグループ分けして一般化または比 較を行うための値の範囲。認識されない文字は、静かに無視されます。スレッ ドのキャッシングが完全に最新のことからいくつかの統計を防ぐかもしれない ので、特別のロックがスレッドのキャッシュ操作を追跡するカウンタをマージ するように要求されることに注意してください。 malloc_usable_size 関数は、ptr によって指される割り付けの使用可能なサイ ズを返します。返り値は、割り付けの間に要求されたサイズより大きいかもし れません。malloc_usable_size 関数は、インプレース (入力データを直接書き 換える) の realloc のためのメカニズムではありません。どちらかといえば、 それは、単に内観目的のためのツールとして提供されます。そのような振る舞 いが完全に実装依存であるので、要求された割り付けサイズと malloc_usable_size によって報告されたサイズの間のあらゆる相違は、依存さ れるべきではありません。 調整 いったん、最初の呼び出しがメモリ割り付けルーチンのうちの 1 つで行われる とき、アロケータ (割り付けルーチン) は、コンパイル時、または実行時に指 定することができる、様々なオプションの一つに基づいてその内部を初期化し ます、 --with-malloc-conf を通して指定された文字列、グローバル変数 malloc_conf によって指された文字列、/etc/malloc.conf で指定されたシンボリックリンク によって参照されたファイルの "name" と環境変数 MALLOC_CONF の値は、オプ ションとして左から右の順序で解釈されます。malloc_conf は、main に入る前 に読み込まれるので、malloc_conf の宣言は、jemalloc によって読み込まれる 最後の値を含んでいる初期化ルーチン (initializer) を指定するべきであるこ とに注意してください。--with-malloc-conf と malloc_conf は、コンパイル 時間のメカニズムですが、一方プログラムの呼び出しの前のいつでも /etc/malloc.conf と MALLOC_CONF を安全に設定することができます。 オプションの文字列は、コンマで区切られた option:value (オプション:値) のペアのリストです。各 "opt.*" mallctl に対応する 1 つのキーがあります (オプションの文書については、「MALLCTL 名前空間」セクションを参照)。例 えば、abort:true,narenas:1 は、"opt.abort" と "opt.narenas" オプション を設定します。いくつかのオプションには、ブール値の値 (真/偽) があり、他 のものには、整数値 (接頭辞に依存して、8、10、または 16) があり、さらに 他のものには、生の文字列の値があります。 実装に関する注 伝統的に、アロケータは、最大の使用可能なメモリに関して、競合条件、増強 された断片化と人為的な制限を含んで、いくつかの理由で準最適である、メモ リを獲得するために sbrk(2) を使用しました。sbrk(2) がオペレーティングシ ステムによってサポートされているなら、このアロケータは、好みのその順序 で、mmap(2) と sbrk(2) の両方を使用します。そうでなければ、mmap(2) だけ が使用されます。 このアロケータは、マルチプロセッサのシステムでスレッド化されたプログラ ムのためのロックの競合を縮小するために複数のアリーナを使用します。これ は、スレッド化の拡張可能性に関してうまくいきますが、いくらかのコストを 負います。固定のアリーナごとに小さなオーバヘッドがあり、さらに、アリー ナは、全体的なメモリの断片化の小さな固定された増加を意味する、互いに完 全に独立したメモリを管理します。これらのオーバヘッドは、通常使用される アリーナの数を考えると、一般的に問題ではありません。デフォルトより実質 的により多くのアリーナを使用することは、主として縮小されたキャッシュの 性能のために、性能を向上しそうにないことに注意してください。しかしなが ら、アプリケーションがあまり割り付け関数を使用しないなら、アリーナの数 を減らすことは意味があります。 複数のアリーナに加えて、--disable-tcache が設定の間に指定されなければ、 このアロケータは、ほとんどの割り付け要求のための同期を完全に回避するこ とを可能にするために、スモールとラージ (small と large) オブジェクトの ためのスレッド特有のキャッシュをサポートしています。そのようなキャッシ ングによって、通常の場合に非常に速い割り付けができますが、各スレッドの キャッシュでオブジェクトの境界のある数を割り付けたままであるかもしれな いので、メモリの使用量と断片化を増加させます。 メモリは、概念的に等しいサイズのチャンクに分割されます、ここで、チャン クサイズは、ページサイズより大きい 2 のべき乗です。チャンクは、常にチャ ンクサイズの倍数に整列されます。この整列は、ユーザオブジェクトのための メタデータをとても速く見つけることを可能にします。ユーザオブジェクト は、サイズに従って、3 つのカテゴリに分割されます: スモール (small)、 ラージ (large) とヒュージ (huge)。複数のスモールとラージオブジェクト は、単一のチャンク内に存在することができますが、一方ヒュージオブジェク トのそれぞれは、それらを裏打ちしている 1 つ以上のチャンクがあります。ス モールおよびラージオブジェクトを含んでいる各チャンクは、隣接している ページ (未使用、裏打ちされた 1 組のスモールオブジェクトまたは裏打ちされ た 1 つのラージオブジェクト) の実行としてその内容を追跡しますチャンクの 整列とチャンクのページマップの組み合わせによって、一定の時間で小さなも のと大きなものの割り付けに関するすべてのメタデータを決定することを可能 にします。 スモールオブジェクトは、ページの等級 (run) によってグループで管理されま す。各等級は、どの領域が使用中であるかを追跡するビットマップを維持しま す。(アーキテクチャに依存して、8 または 16) の半分以下の量の割り付け要 求は、少なくとも sizeof(double) である最も近い 2 のべき乗に丸められま す。すべての他のオブジェクトのサイズのクラスは、内部の断片化が最も小さ いサイズのクラスを除いたすべてのための約 20% に制限されるサイズの 2 倍 ごとに 4 つのサイズのクラスがあるような空間をとる量の倍数です。スモール サイズのクラスは、ページサイズの 4 倍より小さく、大きいサイズのクラス は、チャンクサイズ ("opt.lg_chunk" オプションを参照) より小さく、ヒュー ジサイズのクラスは、チャンクサイズから PTRDIFF_MAX を越えない最も大きい サイズクラスまで拡張します。 割り付けは、マルチスレッド化されたアプリケーションのために問題となるか もしれませんが、とともにしっかりパックされます。割り付けがキャッシュラ イン (cacheline) の共有に悩まされないことを保証する必要があるなら、利用 者の割り付け要求をキャッシュラインサイズの最も近い倍数まで丸めるか、ま たは割り付けるとき、キャッシュラインの整列を指定します。 realloc, rallocx と xallocx 関数は、制限された状況の下でそれらを移動せ ずに割り付けをリサイズします。*allocx と違って、標準の API は、最も近い サイズのクラスへの割り付けの使用可能なサイズまで表向き切り上げないの で、技術的に、成長する realloc を呼び出す必要があります、例えば、9 バイ トの割り付けから 16 バイトに、または 16 バイトの割り付けから 9 バイトに 縮小します。成長と縮小は、同じサイズのクラスに切り上げられる前のサイズ と後のサイズの両方と同じくらい長い自明に適切な位置に継承します。他の API 保証は、適切な位置にリサイズに関して行われませんが、また、現在の実 装は、前のサイズと後のサイズが両方ラージかまたは両方ヒュージと同じくら い長い、適切な位置にラージとヒュージな割り付けをリサイズすることを試み ます。そのような場合に縮小は、ラージサイズのクラスのために常に成功しま すが、ヒュージサイズのクラスのために、チャンクのアロケータは、分割する ことをサポートしなければなりません ("arena.<i>.chunk_hooks" を参照)。後 続するメモリが現在利用可能であるなら、成長だけが、成功し、さらに、 ヒュージサイズのクラスのために、チャンクのアロケータは、マージすること をサポートしなければなりません。 2 MiB のチャンク、4 KiB ページと 64 ビットのシステムでの 16 バイトの量 を仮定して、各カテゴリのサイズのクラスは、表 1 に表示される通りです。 表 1. サイズクラス +---------+---------+---------------------+ |カテゴリ | 間隔 | サイズ | +---------+---------+---------------------+ | | lg | [8] | | +---------+---------------------+ | | 16 | [16, 32, 48, 64, | | | | 80, 96, 112, 128] | | +---------+---------------------+ | | 32 | [160, 192, 224, | | | | 256] | | +---------+---------------------+ | | 64 | [320, 384, 448, | | | | 512] | | +---------+---------------------+ | | 128 | [640, 768, 896, | |スモール | | 1024] | | +---------+---------------------+ | | 256 | [1280, 1536, 1792, | | | | 2048] | | +---------+---------------------+ | | 512 | [2560, 3072, 3584, | | | | 4096] | | +---------+---------------------+ | | 1 KiB | [5 KiB, 6 KiB, 7 | | | | KiB, 8 KiB] | | +---------+---------------------+ | | 2 KiB | [10 KiB, 12 KiB, 14 | | | | KiB] | +---------+---------+---------------------+ | | 2 KiB | [16 KiB] | | +---------+---------------------+ | | 4 KiB | [20 KiB, 24 KiB, 28 | | | | KiB, 32 KiB] | | +---------+---------------------+ | | 8 KiB | [40 KiB, 48 KiB, 54 | | | | KiB, 64 KiB] | | +---------+---------------------+ | | 16 KiB | [80 KiB, 96 KiB, | | | | 112 KiB, 128 KiB] | |ラージ +---------+---------------------+ | | 32 KiB | [160 KiB, 192 KiB, | | | | 224 KiB, 256 KiB] | | +---------+---------------------+ | | 64 KiB | [320 KiB, 384 KiB, | | | | 448 KiB, 512 KiB] | | +---------+---------------------+ | | 128 KiB | [640 KiB, 768 KiB, | | | | 896 KiB, 1 MiB] | | +---------+---------------------+ | | 256 KiB | [1280 KiB, 1536 | | | | KiB, 1792 KiB] | +---------+---------+---------------------+ | | 256 KiB | [2 MiB] | | +---------+---------------------+ | | 512 KiB | [2560 KiB, 3 MiB, | | | | 3584 KiB, 4 MiB] | | +---------+---------------------+ | | 1 MiB | [5 MiB, 6 MiB, 7 | | | | MiB, 8 MiB] | | +---------+---------------------+ | | 2 MiB | [10 MiB, 12 MiB, 14 | | | | MiB, 16 MiB] | | +---------+---------------------+ |ヒュージ | 4 MiB | [20 MiB, 24 MiB, 28 | | | | MiB, 32 MiB] | | +---------+---------------------+ | | 8 MiB | [40 MiB, 48 MiB, 56 | | | | MiB, 64 MiB] | | +---------+---------------------+ | | ... | ... | | +---------+---------------------+ | | 512 PiB | [2560 PiB, 3 EiB, | | | | 3584 PiB, 4 EiB] | | +---------+---------------------+ | | 1 EiB | [5 EiB, 6 EiB, 7 | | | | EiB] | +---------+---------+---------------------+ MALLCTL 名前空間 次の名前は、mallctl* 関数によってアクセス可能な名前空間に定義されていま す。値のタイプは、括弧の中に指定され、それらの読み込み可能/書き込み可能 な状態は、rw, r-, -w または -- としてエンコードされ、要求された構築設定 フラグは、もしあるなら、従います。<i> または <j> としてエンコードされた 名前の要素は、整数の構成要素を示します、ここで整数は、0 から内観によっ て決定されなければならないある上位の値まで変化します。 "stats.arenas.<i>.*" の場合に、"arenas.narenas" と等しい <i> は、すべ てのアリーナから統計値の要約にアクセスするために使用することができま す。キャッシュされた動的な統計値のリフレッシュを制御する、"epoch" mallctl の特別の注記を取ります。 "version" (const char *) r jemalloc バージョンの文字列を返します。 "epoch" (uint64_t) rw 値が渡されるなら、mallctl* 関数は、値を報告し、epoch を増加するデー タをリフレッシュします。現在の epoch を返します。これは、別のスレッ ドがリフレッシュを引き起こしたかどうかを検出するために役に立ちま す。 "config.cache_oblivious" (bool) r --enable-cache-oblivious は、構築設定の間に指定されました。 "config.debug" (bool) r --enable-debug は、構築設定の間に指定されました。 "config.fill" (bool) r --enable-fill は、構築設定の間に指定されました。 "config.lazy_lock" (bool) r --enable-lazy-lock は、構築設定の間に指定されました。 "config.malloc_conf" (const char *) r 組み込みの設定時に指定された実行時のオプションの文字列、 --with-malloc-conf が構築の設定の間に指定されないなら、空です。 "config.munmap" (bool) r --enable-munmap は、構築設定の間に指定されました。 "config.prof" (bool) r --enable-prof は、構築設定の間に指定されました。 "config.prof_libgcc" (bool) r --disable-prof-libgcc は、構築設定の間に指定されませんでした。 "config.prof_libunwind" (bool) r --enable-prof-libunwind は、構築設定の間に指定されました。 "config.stats" (bool) r --enable-stats は、構築設定の間に指定されました。 "config.tcache" (bool) r --disable-tcache は、構築設定の間に指定されませんでした。 "config.tls" (bool) r --disable-tls は、構築設定の間に指定されませんでした。 "config.utrace" (bool) r --enable-utrace は、構築設定の間に指定されました。 "config.valgrind" (bool) r --enable-valgrind は、構築設定の間に指定されました。 "config.xmalloc" (bool) r --enable-xmalloc は、構築設定の間に指定されました。 "opt.abort" (bool) r 有効にされた/無効にされた警告中のアボート。真であるなら、ほとんどの 警告は、致命的です。プロセスは、これらの場合に abort(3) を呼び出し ます。このオプションは、デフォルトで無効になります、--enable-debug が設定の間に指定されない場合は、デフォルトで有効になります。 "opt.dss" (const char *) r mmap(2) 割り付けに関連づけられる dss (sbrk(2)) 割り付けの優先順位。 次の設定がサポートされます: 次の設定は、sbrk(2) がオペレーティング システムによってサポートされるなら、サポートされます: "disabled", "primary" と "secondary"。そうでなければ、"disabled" だけがサポート されます。デフォルトは、sbrk(2) がオペレーティングシステムによって サポートされるなら、"secondary" です。そうでなければ、"disabled" で す。 "opt.lg_chunk" (size_t) r 仮想メモリのチャンクサイズ。(2 を底とする対数 (log))。サポートされ ているサイズ範囲の外側のチャンクサイズが指定されるなら、サイズは、 サポートされているサイズの最小/最大の範囲に静かに刈り込まれます。デ フォルトのチャンクサイズは、4 MiB (2^21) です。 "opt.narenas" (unsigned) r スレッドとアリーナの自動多重化のために使用するアリーナの最大数。デ フォルトは、CPU の数の 4 倍、または単一の CPU があるなら、1 です。 "opt.purge" (const char *) r パージモードは、"ratio" (デフォルト) または "decay" です。ratio モードの詳細については、"opt.lg_dirty_mult" を参照してください。 decay モードの詳細については、"opt.decay_time" を参照してください。 "opt.lg_dirty_mult" (ssize_t) r ページをダーティにするアクティブのアリーナごとの最小の比率 (2 を底 とする対数 (log))。いくつかのダーティな未使用のページは、madvise(2) または同様のシステムコールによって、それらのページのうちのいくつか に関してカーネルに通知する前に、比率 (または、ダーティなページの 1 つのチャンクの価値、どちらか大きい方) によって設定される制限内で、 蓄積することが許可されます。これは、物理メモリが少なくなり、ページ が未使用のままであるなら、ダーティなページを再利用するための十分な 情報をカーネルに提供します。デフォルト最小の比率は、8:1 (2^3:1) で す。-1 のオプションの値は、ダーティなページの消去を無効にします。関 連する動的な制御オプションについては、"arenas.lg_dirty_mult" と "arena.<i>.lg_dirty_mult" を参照してください。 "opt.decay_time" (ssize_t) r 未使用の汚い (dirty) ページの同等の組が、消去される、および再使用さ れないなら、未使用の汚い (dirty) ページの組の作成から秒単位のおおよ その時間。ページは、0 のパージレートで始まり、終わる sigmoidal decay 曲線にしたがって増加的に消去されます。0 の decay 時間によっ て、すべての未使用の汚い (dirty) ページは、作成時に直ちに消去されま す。-1 の decay 時間は、消去を無効にします。デフォルトの decay 時間 は、10 秒です。関連する動的な制御オプションについては、 "arenas.decay_time" と "arena.<i>.decay_time" を参照してください。 "opt.stats_print" (bool) r 終了時に印刷する統計値を有効に/無効にします。有効であるなら、 malloc_stats_print 関数は、atexit(3) 関数によってプログラムの終了時 に呼び出されます。--enable-stats が設定の間に指定されるなら、これに は、1 つ以上のスレッドがメモリ割り付け関数で実行している間に、終了 するマルチスレッドのプロセスのためのデッドロックを引き起こす可能性 があります。さらに、atexit は、アプリケーションの初期化の間にメモリ を割り付けて、次に、jemalloc が atexit を順々に呼び出すとき、内部的 にデッドロック状態になるので、このオプションは、普遍的に使用可能で はありません (が、アプリケーションは、同等の機能でそれ自体の atexit 関数を登録することができます)。したがって、このオプションは、注意し て使用されるべきです。それは、主として、アプリケーション開発の間の 性能の調整の援助することを目的としています。このオプションは、デ フォルトで無効にされます。 "opt.junk" (const char *) r- [--enable-fill] ジャンクの詰め物。"alloc" に設定されるなら、初期化されていない割り 付けメモリの各バイトは、0xa5 に初期化されます。"free" に設定される なら、すべての割り付け解除されたメモリは、0x5a に初期化されます。 "true" に設定されるなら、割り付けられ、割り付け解除されたメモリの両 方は、初期化され、"false" に設定されるなら、ジャンクの詰め物は、完 全に無効にされます。これは、デバッグを対象としていて、性能に悪影響 を与えます。このオプションは、--enable-debug が設定の間に指定されな いなら、デフォルトで、"false" です、その場合に、Valgrind[2] の内部 で実行されていないなら、デフォルトで、"true" です。 "opt.quarantine" (size_t) r- [--enable-fill] バイト単位のスレッドごとの隔離された (quarantine) サイズ。0 でない なら、各スレッドは、メモリの指定された数のバイトまで格納する FIFO オブジェクトの隔離を維持します。隔離されたメモリは、"opt.junk" オプ ションが有効にされるなら、直ちにジャンクの詰め物されますが、隔離か ら解放されるまで、解放されません。この機能は、隔離されたオブジェク トにアクセスする試みを検出することができる、Valgrind[2] と組み合わ せて特に使用されます。これは、デバッグを対象としていて、性能に悪影 響を与えます。デフォルトの隔離サイズは、Valgrind の内部で実行されな ければ、0 で、その場合に、デフォルトは、16 MiB です。 "opt.redzone" (bool) r- [--enable-fill] 有効にされる/無効にされるレッドゾーン。有効にされるなら、小さな割り 付けは、それらの前と後にレッドゾーンがあります。さらに、"opt.junk" オプションが有効にされるなら、レッドゾーンは、割り付け解除の間に、 破壊があるかチェックされます。しかしながら、この機能の意図する主な 目的は、バッファオーバフロー/アンダフローの検出を効率的に行うために レッドゾーンを必要とする、Valgrind[2] と組み合わせて使用されること です。これは、デバッグを対象としていて、性能に悪影響を与えます。こ のオプションは、Valgrind の内部で実行されなければ、デフォルトで無効 にされます。 "opt.zero" (bool) r- [--enable-fill] 有効にされる/無効にされる 0 の詰め物。有効にされるなら、初期化され ていない割り付けられたメモリの各バイトは、0 で初期化されます。この 初期化は、各バイトに対して一度だけ起こるので、realloc と rallocx 呼 び出しは、以前に割り付けられたメモリを 0 にしないことに注意してくだ さい。これはデバッグを意図し、実行に否定的に影響を与えるでしょう。 このオプションは、デフォルトで無効にされます。 "opt.utrace" (bool) r- [--enable-utrace] 有効にされる/無効にされる utrace(2) に基づいた、割り付けの追跡。こ のオプションは、デフォルトで無効にされます。 "opt.xmalloc" (bool) r- [--enable-xmalloc] 有効にされる/無効にされるメモリ不足でのアボート (Abort-on-out-of-memory)。有効にされるなら、任意の割り付け関数のた めに失敗を返すのではなく、STDERR_FILENO の診断メッセージを表示し て、プログラムが (abort(3) を使用して) コアを落とします。アプリケー ションが、この振る舞いに依存するように設計されているなら、ソース コードに次を含めることによって、コンパイル時にオプションを設定しま す: malloc_conf = "xmalloc:true"; このオプションは、デフォルトで無効にされます。 "opt.tcache" (bool) r- [--enable-tcache] 有効にされる/無効にされるスレッド特有のキャッシング (tcache)。複数 のスレッドがあるとき、各スレッドは、特定のサイズまで、オブジェクト のための tcache を使用します。スレッド特有のキャッシングによって、 増加したメモリの使用を犠牲にして、あらゆるスレッドの同期を行なわず に多くの割り付けを、満足させることができます。関連する調整の情報に ついては、"opt.lg_tcache_max" このオプションは、Valgrind[2] の内部 で実行していないなら、デフォルトで有効にされます、その場合に、強制 的に無効にされます。 "opt.lg_tcache_max" (size_t) r- [--enable-tcache] スレッド特有のキャッシュ (tcache) でキャッシュする最大サイズのクラ ス (2 を底とする対数 (log))。最小では、すべての小さなサイズのクラス は、キャッシュされ、最大では、すべての大きなサイズのクラスは、 キャッシュされます。デフォルトの最大は、32 KiB (2^15) です。 "opt.prof" (bool) r- [--enable-prof] 有効にされる/無効にされるメモリのプロファイリング。有効にされるな ら、メモリ割り付けの動作をプロファイルします。オンザフライ (on-the-fly) の活性化/非活性化については、"opt.prof_active" オプ ションを参照してください。確率的なサンプリングの制御については、 "opt.lg_prof_sample" オプションを参照してください。累積されたサンプ ル報告の制御については、"opt.prof_accum" オプションを参照してくださ い。間隔 (interval) の引き金となるプロファイルのダンプの情報につい ては、"opt.lg_prof_interval" オプションを、高水位 (high-water) の引 き金となるプロファイルのダンプの情報については、"opt.prof_gdump" オ プションを、最終のプロファイルのダンプついては、"opt.prof_final" オ プションを参照してください。プロファイルの出力は、gperftools パッ ケージ[3] の一部として開発された pprof に基づく、jeprof コマンドと 互換性があります。ヒーププロファイルの形式の文書については、「ヒー ププロファイルの形式」を参照してください。 "opt.prof_prefix" (const char *) r- [--enable-prof] プロファイルのダンプのためのファイル名の接頭辞。接頭辞が空の文字列 に設定されるなら、自動的にダンプは、起こりません。これは、(また、有 効にされるなら、リークの (leak) 報告を無効にする) 自動的な最終の ヒープダンプを無効にするために主として役に立ちます。デフォルトの接 頭辞は、jeprof です。 "opt.prof_active" (bool) r- [--enable-prof] 活性化される/非活性化されるプロファイリング。これは、不活発ですが、 有効にされたプロファイリング ("opt.prof" オプション参照) でアプリ ケーションを開始することを可能にする二次的制御メカニズムです、次 に、"prof.active" mallctl でプログラム実行の間にいつでもプロファイ リングを切り替えます。このオプションは、デフォルトで有効にされま す。 "opt.prof_thread_active_init" (bool) r- [--enable-prof] 新しく作成されたスレッドの "thread.prof.active" のための初期設定。 また、新しく作成されたスレッドのための初期設定は、 "prof.thread_active_init" mallctl を通した実行の間に変更することが できます。このオプションは、デフォルトで有効にされます。 "opt.lg_prof_sample" (size_t) r- [--enable-prof] 割り付け動作のバイト単位で測定された割り付けサンプルの間の平均の間 隔 (2 を底とする対数 (log))。サンプリングの間隔を増加させることは、 プロファイルの忠実性を減少させますが、また、計算のオーバヘッドを減 少させます。デフォルトのサンプル間隔は、512 KiB (2^19 B) です。 "opt.prof_accum" (bool) r- [--enable-prof] 有効にされる/無効にされるプロファイルダンプの累積されたオブジェク ト/バイトのカウントの報告。このオプションが有効にされるなら、すべて のユニークなバックトレース (backtrace) は、実行の継続期間に格納され なければなりません。アプリケーションによって、これは、大きなメモリ のオーバヘッドを与えるかもしれません、そして、累積されるカウント は、必ずしも興味深いとは限りません。このオプションは、デフォルトで 無効にされます。 "opt.lg_prof_interval" (ssize_t) r- [--enable-prof] 割り付け動作のバイト単位で測定されたメモリプロファイルの間の平均の 間隔 (2 を底とする対数 (log))。ダンプ間の実際の間隔は、分散化された 割り付けカウンタは、同期のボトルネックを回避するために使用されるの で、散発的であるかもしれません。プロファイルは、パターン <prefix>.<pid>.<seq>.i<iseq>.heap に従って名前を付けられたファイル にダンプされます、ここで、<prefix> は、"opt.prof_prefix" オプション によって制御されます。デフォルトで、間隔で引き金となるプロファイル のダンプは、(-1 としてエンコードされ) 無効にされます。 "opt.prof_gdump" (bool) r- [--enable-prof] 有効にされるとき、合計の仮想メモリが前の最高を越えている時ごとにメ モリプロファイルダンプをトリガされる、"prof.gdump" の初期の状態を設 定します。このオプションは、デフォルトで無効にされます。 "opt.prof_final" (bool) r- [--enable-prof] パターン <prefix>.<pid>.<seq>.f.heap に従って名前を付けられたファイ ルに最後のメモリ使用量をダンプする atexit(3) 関数を使用します、ここ で、<prefix> は、"opt.prof_prefix" オプションによって制御されます。 atexit は、アプリケーションの初期化の間にメモリを割り付け、次に、 jemalloc が atexit を順々に呼び出すとき、内部的にデッドロック状態に なるので、このオプションは、普遍的に使用可能ではない (が、アプリ ケーションは、同等の機能で、それ自体の atexit 関数を登録することが できます) ことに注意してください。このオプションは、デフォルトで無 効にされます。 "opt.prof_leak" (bool) r- [--enable-prof] 有効にされる/無効にされるリーク (leak) の報告。有効にされるなら、割 り付けサンプリングによって検出されたメモリリークを報告するために atexit(3) 関数を使用します。ヒープのプロファイル出力の解析に関する 情報については、"opt.prof" オプションを参照してください。このオプ ションは、デフォルトで無効にされます。 "thread.arena" (unsigned) rw 呼び出しているスレッドに関連するアリーナを取得するか、設定します。 指定されたアリーナがあらかじめ初期化されていないなら ("arenas.initialized" mallctl 参照)、このインタフェースを呼び出す副 作用として自動的に初期化されます。 "thread.allocated" (uint64_t) r- [--enable-stats] 呼び出しているスレッドによってかつて割り付けられたバイトの合計数を 取得します。このカウンタには、ラップアラウンド (wrap around) する可 能性があります。そのような場合にカウンタを適切に解釈することはアプ リケーション次第です。 "thread.allocatedp" (uint64_t *) r- [--enable-stats] "thread.allocated" mallctl によって返された値へのポインタを取得しま す。これは、繰り返された mallctl* 呼び出しのオーバヘッドを回避する のに役に立ちます。 "thread.deallocated" (uint64_t) r- [--enable-stats] 呼び出しているスレッドよってかつて割り付け解放されたバイトの合計数 を取得します。このカウンタには、ラップアラウンド (wrap around) する 可能性があります。そのような場合に、カウンタを適切に解釈することは アプリケーション次第です。 "thread.deallocatedp" (uint64_t *) r- [--enable-stats] "thread.deallocated" mallctl によって返された値へのポインタを取得し ます。これは、繰り返された mallctl* 呼び出しのオーバヘッドを回避す るのに役に立ちます。 "thread.tcache.enabled" (bool) rw [--enable-tcache] 呼び出しているスレッドの tcache を有効に/無効にします。tcache は、 無効になる副作用として暗黙のうちにフラッシュされます ("thread.tcache.flush" 参照)。 "thread.tcache.flush" (void) -- [--enable-tcache] 呼び出しているスレッドのスレッド特有のキャッシュ (tcache) をフラッ シュします。このインタフェースは、呼び出しているスレッドの tcache に関連したすべてのキャッシュに入れられたオブジェクトと内部データ構 造を解放します。通常、自動的な周期の増加するガーベジコレクションが 生じる、スレッドが終了するとき、スレッドのキャッシュが、自動的に廃 棄されるので、このインタフェースを呼び出す必要はありません。しかし ながら、ガーベジコレクションは、割り付け動作が引き金となるので、そ のキャッシュを無期限に保持するために割り付け/割り付け解放を停止する スレッドに可能です、その場合に、開発者は、手動のフラッシュが役に立 つのが分かります。 "thread.prof.name" (const char *) r- or -w [--enable-prof] メモリプロファイルダンプの呼び出しているスレッドと関連した記述的な 名前を取得/設定します。名前の文字列の内部のコピーは、作成されるの で、入力文字列は、このインタフェースの実行が完成した後に、維持され る必要はありません。複数の実装の詳細が非同期の文字列の割り付け解除 を起こすかもしれないので、このインタフェースの出力文字列は、短命で ない使用のためにコピーされるべきです。さらに、このインタフェースの 各呼び出しは、読み込みまたは書き込みだけを行うことができます。同時 の読み込み/書き込みは、文字列の有効期間のためサポートされません。名 前の文字列は、ヌル文字で終わらなければなりません、isgraph(3) と isblank(3) によって認識される設定の文字だけから成ります。 "thread.prof.active" (bool) rw [--enable-prof] サンプリングが呼び出しているスレッドのために現在アクティブであるか どうかを制御します。これは、"prof.active" に加えて活性化メカニズム です。両方は、呼び出しているスレッドがサンプリングするようにアク ティブでなければなりません。このフラグは、デフォルトで有効にされま す。 "tcache.create" (unsigned) r- [--enable-tcache] 明示的なスレッド特有のキャッシュ (tcache) を作成し、デフォルトで使 用される自動的に管理されるものではなく、指定されたキャッシュを明示 的に使用する MALLOCX_TCACHE(tc) マクロに渡すことができる識別子を返 します。各明示的なキャッシュは、同時に 1 つのスレッドのみによって使 用することができます。アプリケーションは、この強制が保持されること を保証しなければなりません。 "tcache.flush" (unsigned) -w [--enable-tcache] 指定されたスレッド特有のキャッシュ (tcache) をフラッシュします。同 じ考慮は、tcache が決して自動的に破棄されないことを除いて、 "thread.tcache.flush" に関してこのインタフェースに適用します。 "tcache.destroy" (unsigned) -w [--enable-tcache] 指定されたスレッド特有のキャッシュ (tcache) をフラッシュし、将来の tcache 作成の間に使用するために識別子を利用可能にします。 "arena.<i>.purge" (void) -- アリーナ <i> または <i> が "arenas.narenas" と等しいなら、すべての アリーナのためのすべての未使用の汚い (dirty) ページを消去します。 "arena.<i>.decay" (void) -- アリーナ <i>、または <i> が "arenas.narenas" と等しいなら、すべての アリーナのための未使用の汚い (dirty) ページの decay ベースの消去を トリガします。消去される未使用の汚い (dirty) ページの割合は、現在の 時間に依存します。詳細については、"opt.decay_time" を参照してくださ い。 "arena.<i>.reset" (void) -- アリーナの現存の割り付けのすべてを破棄します。このインタフェース は、"arenas.extend" を通して作成されたアリーナでのみ使用することが できます。アリーナの破棄された/キャッシュされた割り付けのどれも、後 にアクセスされません。この要件の一部として、アリーナとともに割り付 け/割り付け解除で使用されたすべてのスレッドのキャッシュは、前もって フラッシュされていなければなりません。Valgrind の内側で実行している 場合でも、隔離サイズが 0 ではない場合でも、ないなら、このインタ フェースは、使用することができません。 "arena.<i>.dss" (const char *) rw アリーナ <i> の、または <i> が "arenas.narenas" と等しいなら、すべ てのアリーナの mmap 割り付けに関連づけられる dss 割り付けの優先順位 を設定します。巨大な割り付けの間でさえ、アプリケーションが割り付け サイズにかかわらず一貫した dss 対 mmap 割り付けに依存することができ るように、小さいか、または大きな割り付けのために選択されるアリーナ から、この設定が読み込まれることに注意してください。サポートされる 設定については、"opt.dss" を参照してください。 "arena.<i>.lg_dirty_mult" (ssize_t) rw 現在のアリーナごとの最小の比率 (2 を底とする log) アリーナ <i> のた めの汚い (dirty) ページをアクティブにします。このインタフェースが設 定されるたびに、比率が増加され、ページは、新しい比率を強制する必要 に応じて同期して消去されます。追加の情報については、 "opt.lg_dirty_mult" を参照してください。 "arena.<i>.decay_time" (ssize_t) rw 未使用の汚い (dirty) ページの同等の組が消去および再利用されないな ら、未使用の汚い (dirty) ページの組の作成から秒単位の現在のアリーナ ごとのおおよその時間。このインタフェースが設定されるたびに、すべて の現在の未使用の汚い (dirty) ページは、完全に decay されたと見なさ れます、その場合に、decay 時間が -1 (すなわち、無効にされた消去) に 設定されないなら、すべての未使用の汚い (dirty) ページの直ちに消去し ます。追加の情報については、"opt.decay_time" を参照してください。 "arena.<i>.chunk_hooks" (chunk_hooks_t) rw アリーナ <i> のためのチャンク管理のフック関数を取得するか、または設 定します。関数は、通常、未知のチャンクを置き換えられた関数に渡すこ とによってアリーナ <i> と関連したすべての実在のチャンクで操作する能 力がなければなりません。実際に、すべてのチャンクが、(アリーナ作成の 直後にカスタムのチャンクのフック関数を設定することによって) アプリ ケーションに供給されたチャンクのアロケータから始まるような "arenas.extend" を通して作成されたアリーナのために割り付けを制御す ることが実行可能ですが、自動的に作成されたアリーナは、チャンクの割 り付けを引き継ぐ機会があるアプリケーションより前に、すでに作成され たチャンクがあります。 typedef struct { chunk_alloc_t *alloc; chunk_dalloc_t *dalloc; chunk_commit_t *commit; chunk_decommit_t *decommit; chunk_purge_t *purge; chunk_split_t *split; chunk_merge_t *merge; } chunk_hooks_t; chunk_hooks_t 構造体は、下記の個別に説明された関数ポインタから成っ ています。jemalloc は、割り付け解除が続いている最も簡単な場合に、 マップされた関係したメモリの割り付けを始めるチャンク生存期間を管理 するめに、これらの関数を使用します。しかしながら、後の再利用のため のチャンクを保持する性能とプラットフォームの理由があります。クリー ンアップは、それほど永久的ではない (そして、しばしば高価ではない) ことを支持して最も永久的なクリーンアップ操作を拒否するチャンク管理 関数の機会を与える、消去するために委任を解除する割り付け解除からカ スケードを試みます。また、チャンクの分割とマージ操作を抜け出ること ができますが、オペレーティングシステムのカーネルによって提供された 仮想メモリのマッピングが、自動的に融合せず、分割しません、例えば、 Windows、これは、プラットフォームをサポートすることを主として目的と しています。 typedef void *(chunk_alloc_t)(void *chunk, size_t size, size_t alignment, bool *zero, bool *commit, unsigned arena_ind); チャンク割り付け関数は、chunk_alloc_t タイプに適合し、チャンクが 0 にされるかどうかを示す *zero とチャンクが委任されるかどうかを示す *commit の設定と同様に、チャンクのベースアドレスが、alignment の倍 数でありような、成功すれば、アリーナ arena_ind の代わりにマップされ たメモリの size バイトへのポインタを返します。エラーにおいて、関数 は、NULL を返し、*zero と *commit は、修正されないままとします。 size パラメータは、常にチャンクサイズの倍数です。alignment パラメー タは、常に少なくともチャンクサイズと同じくらいの 2 のべき乗です。 *zero が関数の入口で真であるなら、0 にすることは、強制的です。 *commit が関数の入口で真であるなら、委任することは、強制的です。 chunk が NULL ではないなら、返されたポインタは、成功すれば、chunk でエラーの場合は、NULL でなければなりません。委任されたメモリは、過 度な約束を行わないシステムでのような絶対的な用語で、またはソフト ページフォルトを通して要求に応じて必要とされる物理的なメモリを過度 な約束と満足するシステムでのような暗黙の用語で、委任されます。デ フォルトのチャンクの割り付け関数を置き換えることは、アリーナの "arena.<i>.dss" 無関係のの設定を行うことに注意してください。 typedef bool (chunk_dalloc_t)(void *chunk, size_t size, bool committed, unsigned arena_ind); チャンクの割り付け解除関数は、chunk_dalloc_t タイプに適合し、成功す れば誤りを返す、アリーナ arena_ind の代わりに、示されたように committed/委任解除メモリで与えられた size の chunk を割り付け解除し ます。関数が真を返すなら、これは、割り付け解除からの見合わせること を示します。仮想メモリのマッピングは、同じ委任状態と将来の使用のた めに利用可能な、マップされたままのチャンクと関連して、その場合に、 後の再利用のために自動的に保持されます。 typedef bool (chunk_commit_t)(void *chunk, size_t size, size_t offset, size_t length, unsigned arena_ind); チャンク委任関数は、chunk_commit_t タイプに適合し、成功すれば誤りを 返す、アリーナ arena_ind の代わりに、length のために拡張して、 offset バイトで、与えられた size の chunk 内のページを裏打ちする 0 にされた物理メモリを委任します。委任されたメモリは、過度な約束を行 わないシステムでのような絶対的な用語で、またはソフトページフォルト を通して要求に応じて必要とされる物理的なメモリを過度な約束と満足す るシステムでのような暗黙の用語で、委任されます。関数が真を返るな ら、これは、要求を満たす不十分な物理メモリを示します。 typedef bool (chunk_decommit_t)(void *chunk, size_t size, size_t offset, size_t length, unsigned arena_ind); チャンクの委任解除関数は、chunk_decommit_t タイプと適合し、成功で誤 りを返す、アリーナ arena_ind の代わりに length のために拡張され、 offset バイトで与えられた size の chunk 内のページに裏打ちされたあ らゆる物理メモリを委任解除します。関数が真を返すなら、これは、委任 解除から見合わせることを示します。メモリは、委任されたままで、将来 の使用のために利用可能です、その場合に、後の再利用のために自動的に 保持されます。 typedef bool (chunk_purge_t)(void *chunk, size_tsize, size_t offset, size_t length, unsigned arena_ind); チャンク消去関数は、chunk_purge_t タイプに適合し、消去された仮想メ モリ範囲内のページがそれらがアクセスされる次の回に、0 で満たされる なら、偽を返す、アリーナ arena_ind の代わりに length のために拡張さ れ、offset バイトで与えられた size の chunk と関連する仮想メモリ マッピング内の物理的なページをオプションで破棄します。 typedef bool (chunk_split_t)(void *chunk, size_t size, size_t size_a, size_t size_b, bool committed, unsigned arena_ind); チャンク分割関数は、chunk_split_t タイプに適合し、成功で誤りを返 す、アリーナ arena_ind の代わりに、示されるように、committed/委任解 除されたメモリで操作され、最初の size_a バイトと 2 番目 size_b バイ トの与えられた size の chunk を、2 つの隣接したチャンクにオプション で分割します。関数が真を返すなら、これは、チャンクが分割されないま まで、そのために、全体として操作され続けるべきですであることを示し ます。 typedef bool (chunk_merge_t)(void *chunk_a, size_t size_a, void *chunk_b, size_t size_b, bool committed, unsigned arena_ind); チャンクマージ関数は、chunk_merge_t タイプに適合し、成功で誤りを返 す、アリーナ arena_ind の代わりに示されるように、committed/委任解除 されたメモリで操作され、隣接したチャンク、与えられた size_a の chunk_aと与えられた size_b の chunk_b を 1 つの隣接しているチャンク にオプションでマージします。関数が真を返すなら、これは、チャンクが 区別されたマッピングのままで、したがって、独立して操作され続けるべ きであることを示します。 "arenas.narenas" (unsigned) r アリーナの数に関する現在の制限。 "arenas.initialized" (bool *) r "arenas.narenas" ブール値の配列。各ブール値は、対応するアリーナが初 期化されるかどうかを示します。 "arenas.lg_dirty_mult" (ssize_t) rw 現在のデフォルトのアリーナごとの最小の比率 (2 を底とする log) のア リーナ作成の間に "arena.<i>.lg_dirty_mult" を初期化するために使用さ れた汚い (dirty) ページをアクティブにします。追加の情報については、 "opt.lg_dirty_mult" を参照してください。 "arenas.decay_time" (ssize_t) rw 未使用の汚い (dirty) ページの組の作成から秒単位の現在のデフォルトの アリーナごとのおおよその時間、未使用の汚い (dirty) ページの同等な組 が消去され、および再使用されないなら、アリーナ作成の間に "arena.<i>.decay_time" を初期化するために使用されます。追加の情報に ついては、"opt.decay_time" を参照してください。 "arenas.quantum" (size_t) r クオンタム (quantum) サイズ。 "arenas.page" (size_t) r ページサイズ。 "arenas.tcache_max" (size_t) r- [--enable-tcache] 最大のスレッドにキャッシュされたサイズのクラス。 "arenas.nbins" (unsigned) r bin サイズのクラスの数。 "arenas.nhbins" (unsigned) r- [--enable-tcache] スレッドのキャッシュ bin サイズのクラスの合計数。 "arenas.bin.<i>.size" (size_t) r サイズのクラスによってサポートされた最大のサイズ。 "arenas.bin.<i>.nregs" (uint32_t) r ページ階級 (run) ごとの領域の数。 "arenas.bin.<i>.run_size" (size_t) r ページ階級 (run) ごとのバイトの数。 "arenas.nlruns" (unsigned) r ラージ (large) サイズのクラスの合計数。 "arenas.lrun.<i>.size" (size_t) r このラージサイズのクラスによってサポートされた最大のサイズ。 "arenas.nhchunks" (unsigned) r ヒュージサイズのクラスの合計の数。 "arenas.hchunk.<i>.size" (size_t) r このヒュージサイズのクラスによってサポートされた最大のサイズ。 "arenas.extend" (unsigned) r 新しいアリーナを追加し、新しいアリーナのインデックスを返すことによ り、アリーナの配列を拡張します。 "prof.thread_active_init" (bool) rw [--enable-prof] 新しく作成されたスレッドの "thread.prof.active" のための初期設定を 制御します。追加の情報については、"opt.prof_thread_active_init" オ プションを参照してください。 "prof.active" (bool) rw [--enable-prof] サンプリングが現在アクティブかどうかを制御します。相互に関係づける "thread.prof.active" mallctl と同様に、追加の情報については、 "opt.prof_active" オプションを参照してください。 "prof.dump" (const char *) -w [--enable-prof] 指定されたファイルへにメモリのプロファイルをダンプするか、または NULL が指定されるなら、パターン <prefix>.<pid>.<seq>.m<mseq>.heap に従ってファイルにダンプします、ここで、<prefix> は、 "opt.prof_prefix" オプションによって制御されます。 "prof.gdump" (bool) rw [--enable-prof] 有効にされたとき、合計の仮想メモリが前の最高を越えるたびに、メモリ プロファイルのダンプをトリガします。プロファイルは、パターン <prefix>.<pid>.<seq>.u<useq>.heap に従って指定されたファイルにダン プされます、ここで <prefix> は、"opt.prof_prefix" オプションによっ て制御されます。 "prof.reset" (size_t) -w [--enable-prof] すべてのメモリプロファイルの統計をリセットし、オプションで、サンプ ルレートを更新します ("opt.lg_prof_sample" と "prof.lg_sample" を参 照)。 "prof.lg_sample" (size_t) r- [--enable-prof] 現在のサンプルレートを取得します ("opt.lg_prof_sample" を参照)。 "prof.interval" (uint64_t) r- [--enable-prof] 間隔に基づいたプロファイルのダンプの間に割り付けられたバイトの平均 数。追加情報については、"opt.lg_prof_interval" オプションを参照して ください。 "stats.cactive" (size_t *) r- [--enable-stats] アクティブなページのバイトの現在の数の近似のカウントを含んでいるカ ウンタへのポインタ。カウンタへのその貢献を計算するとき、各アリーナ は、丸められるので、評価は、高いが低くないかもしれません。"epoch" mallctl には、このカウンタと何も関係がないことに注意してください。 さらに、カウンタの一貫性は、不可分の操作によって維持されるので、ポ インタを逆参照するとき、一貫した読み込みを保証するために不可分の操 作を使用することが必要です。 "stats.allocated" (size_t) r- [--enable-stats] アプリケーションによって割り付けられたバイトの合計数。 "stats.active" (size_t) r- [--enable-stats] アプリケーションによって割り付けられたアクティブなページのバイトの 合計数。これは、ページサイズの倍数で、"stats.allocated" 以上です。 これは、"stats.arenas.<i>.pdirty" もアロケータのメタデータに完全に 専念されるページも含みません。 "stats.metadata" (size_t) r- [--enable-stats] ブートストラップに敏感な内部のアロケータデータ構造、アリーナのチャ ンクのヘッダ ("stats.arenas.<i>.metadata.mapped" 参照) と内部のアロ ケータ ("stats.arenas.<i>.metadata.allocated" 参照) のために使用さ れた基本的な割り付けから成る、メタデータに専門のバイトの合計の数。 "stats.resident" (size_t) r- [--enable-stats] アロケータのメタデータ、アクティブな割り付けに裏打ちされたページ、 と未使用の汚い (dirty) ページに専門のすべてのページから成る、アロ ケータによってマップされた常駐しているデータページの物理的なバイト の最大の数。それらが、まだ変更されていなかった要求され 0 にされた仮 想メモリに対応しているなら、ページが実際に物理的に常駐されていない ので、これは、正確でなく、最高です。これは、ページサイズの倍数であ り、"stats.active" より大きくなります。 "stats.mapped" (size_t) r- [--enable-stats] アロケータによってマップされたアクティブなチャンクのバイトの合計 数。これは、チャンクサイズの倍数であり、"stats.active" より大きくな ります。これと "stats.resident" の間の厳密でない順序があることを意 味する、未使用の汚い (dirty) ページを含んでいるそれらでさえ、これ は、アクティブでないチャンクを含みません。 "stats.retained" (size_t) r- [--enable-stats] 例えば、munmap(2) を通してオペレーティングシステムに返されるのでは なく、保持された仮想メモリマッピングの合計バイト数。保持された仮想 メモリは、通常、修正されず、コミット解除されるか、または削除される ので、それには、強く関連した物理メモリがありません (詳細について は、チャンクフックを参照)。保持されたメモリは、マップされたメモリ統 計、例えば、"stats.mapped" から除外されます。 "stats.arenas.<i>.dss" (const char *) r mmap(2) 割り付けに関連づけられる dss (sbrk(2)) 割り付けの優先順位。 詳細については、"opt.dss" を参照してください。 "stats.arenas.<i>.lg_dirty_mult" (ssize_t) r 汚い (dirty) ページにアクティブな最小の比率 (2 を底とする log)。詳 細については、"opt.lg_dirty_mult" を参照してください。 "stats.arenas.<i>.decay_time" (ssize_t) r 未使用の汚い (dirty) ページの同等の組が消去される、および再使用され ないなら、未使用の汚い (dirty) ページのセットの作成から秒単位のおお よその時間。詳細については、"opt.decay_time" を参照してください。 "stats.arenas.<i>.nthreads" (unsigned) r アリーナに現在割り当てられたスレッドの数。 "stats.arenas.<i>.pactive" (size_t) r アクティブな階級 (runs) のページの数。 "stats.arenas.<i>.pdirty" (size_t) r 潜在的にダーティな未使用の階級内のページの数、そして madvise... MADV_DONTNEED のために、または呼び出されていない類似のもの。 "stats.arenas.<i>.mapped" (size_t) r- [--enable-stats] マップされたバイトの数。 "stats.arenas.<i>.retained" (size_t) r- [--enable-stats] 保有されるバイト数。詳細については、"stats.retained" を参照してくだ さい。 "stats.arenas.<i>.metadata.mapped" (size_t) r- [--enable-stats] メタデータでないページの状態を追跡するアリーナのチャンクのヘッダの マップされたバイトの数。 "stats.arenas.<i>.metadata.allocated" (size_t) r- [--enable-stats] 内部の割り付けに専門のバイトの数。内部の割り当ては、それらが内部の 使用のためであり、それらがヒープのプロファイルから省略されるという 点において、アプリケーションの起源の割り付けと異なります。この統計 は、それが、例えば、それとオーバラップしているので、 "stats.metadata" と "stats.arenas.<i>.metadata.mapped" から個別に報 告されます。他のメタデータ統計が行われないのに対して、 "stats.allocated" と "stats.active" 統計。 "stats.arenas.<i>.npurge" (uint64_t) r- [--enable-stats] 実行されたダーティページの消去されたスイープ (sweep) の数。 "stats.arenas.<i>.nmadvise" (uint64_t) r- [--enable-stats] madvise... MADV_DONTNEED の数、または消去されたダーティページに行わ れた同様の呼び出し。 "stats.arenas.<i>.purged" (uint64_t) r- [--enable-stats] 消去されたページの数。 "stats.arenas.<i>.small.allocated" (size_t) r- [--enable-stats] スモールオブジェクトによって現在割り付けられたバイトの数。 "stats.arenas.<i>.small.nmalloc" (uint64_t) r- [--enable-stats] スモール bins によって役に立つ割り付け要求の累積された数。 "stats.arenas.<i>.small.ndalloc" (uint64_t) r- [--enable-stats] bins に返されたスモールオブジェクトの累積された数。 "stats.arenas.<i>.small.nrequests" (uint64_t) r- [--enable-stats] スモール割り付け要求の累積された数。 "stats.arenas.<i>.large.allocated" (size_t) r- [--enable-stats] ラージオブジェクトによって現在割り付けられたバイトの数。 "stats.arenas.<i>.large.nmalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つラージ割り付け要求の累積された数。 "stats.arenas.<i>.large.ndalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つラージ割り付け解放要求の累積された数。 "stats.arenas.<i>.large.nrequests" (uint64_t) r- [--enable-stats] ラージ割り付け要求の累積された数。 "stats.arenas.<i>.huge.allocated" (size_t) r- [--enable-stats] 現在、ヒュージオブジェクトによって割り付けられたバイトの数。 "stats.arenas.<i>.huge.nmalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つヒュージ割り付け要求の累積された数。 "stats.arenas.<i>.huge.ndalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つヒュージ割り付け解除要求の累積された 数。 "stats.arenas.<i>.huge.nrequests" (uint64_t) r- [--enable-stats] ヒュージ割り付け要求の累積された数。 "stats.arenas.<i>.bins.<j>.nmalloc" (uint64_t) r- [--enable-stats] bin によって役に立つ割り付けの累積された数。 "stats.arenas.<i>.bins.<j>.ndalloc" (uint64_t) r- [--enable-stats] bin に返された割り付けの累積された数。 "stats.arenas.<i>.bins.<j>.nrequests" (uint64_t) r- [--enable-stats] 割り付け要求の累積された数。 "stats.arenas.<i>.bins.<j>.curregs" (size_t) r- [--enable-stats] このサイズのクラスのための領域の現在の数。 "stats.arenas.<i>.bins.<j>.nfills" (uint64_t) r- [--enable-stats --enable-tcache] 満たされた tcache の累積された数。 "stats.arenas.<i>.bins.<j>.nflushes" (uint64_t) r- [--enable-stats --enable-tcache] フラッシュされた tcache の累積された数。 "stats.arenas.<i>.bins.<j>.nruns" (uint64_t) r- [--enable-stats] 作成された階級 (runs) の累積された数。 "stats.arenas.<i>.bins.<j>.nreruns" (uint64_t) r- [--enable-stats] 変更された割り付ける現在の階級 (run) の累積された数。 "stats.arenas.<i>.bins.<j>.curruns" (size_t) r- [--enable-stats] 階級 (runs) の現在の数。 "stats.arenas.<i>.lruns.<j>.nmalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つ、このサイズのクラスのための割り付け要 求の累積された数。 "stats.arenas.<i>.lruns.<j>.ndalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つ、このサイズのクラスのための割り付け解 放要求の累積された数。 "stats.arenas.<i>.lruns.<j>.nrequests" (uint64_t) r- [--enable-stats] このサイズのクラスのための割り付け要求の累積された数。 "stats.arenas.<i>.lruns.<j>.curruns" (size_t) r- [--enable-stats] このサイズのクラスのための階級 (runs) の累積された数。 "stats.arenas.<i>.hchunks.<j>.nmalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つこのサイズのクラスのために割り付け要求 の累積された数。 "stats.arenas.<i>.hchunks.<j>.ndalloc" (uint64_t) r- [--enable-stats] アリーナによって直接役に立つこのサイズのクラスのために割り付け解除 要求の累積された数。 "stats.arenas.<i>.hchunks.<j>.nrequests" (uint64_t) r- [--enable-stats] このサイズのクラスのために割り付け要求の累積された数。 "stats.arenas.<i>.hchunks.<j>.curhchunks" (size_t) r- [--enable-stats] このサイズのクラスのためのヒュージ割り付けの現在の数。 ヒーププロファイルの形式 ヒーププロファイリングの機能は、元々 gperftools package[3] の部分として 開発された pprof コマンドと互換性があるように設計されましたが、追加のス レッドごとのヒーププロファイリングの機能は、異なったヒーププロファイル 形式を必要としました。ここに説明されたヒーププロファイル形式のサポート を強化するとともに、jeprof コマンドは、pprof から派生されました。 次の仮定のヒーププロファイルにおいて、[...] は、簡潔さのための省略を示 します。 heap_v2/524288 t*: 28106: 56637512 [0: 0] [...] t3: 352: 16777344 [0: 0] [...] t99: 17754: 29341640 [0: 0] [...] @ 0x5f86da8 0x5f5a1dc [...] 0x29e4d4e 0xa200316 0xabb2988 [...] t*: 13: 6688 [0: 0] t3: 12: 6496 [0: ] t99: 1: 192 [0: 0] [...] MAPPED_LIBRARIES: [...] 次は、上記のヒーププロファイルと一致しますが、ほとんどのトークンは、対 応しているフィールドの説明を示すために、<description> と置き換えられま す。 <heap_profile_format_version>/<mean_sample_interval> <aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>] [...] <thread_3_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>] [...] <thread_99_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>] [...] @ <top_frame> <frame> [...] <frame> <frame> <frame> [...] <backtrace_aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>] <backtrace_thread_3>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>] <backtrace_thread_99>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>] [...] MAPPED_LIBRARIES: </proc/<pid>/maps> MALLOC 問題のデバッグ デバッグするとき、--enable-debug と --enable-fill オプションで jemalloc を設定/構築し、適切なオプションとデバッガサポートのためのシンボルでプロ グラムを再コンパイルすることはよい考えです。したがって、設定するとき、 jemalloc は、double-free、write-after-free、などのようなアプリケーショ ンエラーをキャッチする様々の実行時アサーションを組込みます。 プログラムは、0 バイトで実際に満たされている、"初期化されていない" メモ リにしばしば偶然に依存します。ジャンク詰め物 ("opt.junk" オプション参 照) は、明らかに正しくない結果および/またはコアダンプの形のそのようなバ グをあらわにする傾向があります。反対に、0 の詰め物 ("opt.zero" オプショ ン参照) は、そのようなバグの兆候を排除します。これらの 2 つのオプション 間で、そのようなバグをすばやく検出し、診断し、排除するすることは通常可 能です。 この実装は、そのような情報を格納するために性能の影響が抑制されるので、 それが検出する問題に関する詳細を提供しません。しかしながら、jemalloc は、--enable-valgrind 設定オプションが有効にされるなら、最も優れた m[blue]Valgrind[2] ツールで統合されます。 診断メッセージ メモリ割り付け/割り付け解放関数のいずれかがエラーまたは警告の条件を検出 するなら、メッセージは、ファイル記述子 STDERR_FILENO に印刷されます。エ ラーは、プロセスがコアをダンプする結果となります。"opt.abort" オプショ ンが設定されるなら、ほとんどの警告は、エラーとして扱われます。 malloc_message 変数によって、プログラマは、ある理由のために、 STDERR_FILENO ファイル記述子がこれに適していないなら、エラーと警告を書 式化するテキスト文字列を出力する関数を上書きすることができます。 malloc_message は、文字列ポインタに続いて、malloc_stats_print への呼び 出しの引数によって上書きされないなら、NULL である cbopaque ポインタ引数 を取ります。この関数のメモリを割り付けを試みるものを行うことは、たぶん クラッシュまたはデッドロックの結果になることに注意してください。 すべてのメッセージは、"<jemalloc>:" が前に付けられます。 戻り値 標準 API malloc と calloc 関数は、成功するなら、割り付けられたメモリへのポインタ を返します。そうでなければ、NULL ポインタが返され、errno は、ENOMEM に 設定されます。 posix_memalign 関数は、成功するなら、値 0 を返します。そうでなければ、 それは、エラー値を返します。posix_memalign 関数は、次の場合に失敗しま す: EINVAL alignment パラメータが、少なくとも sizeof(void *) と同じくらいの大 きさで 2 のべき乗ではありません。 ENOMEM メモリ割り付けエラー。 aligned_alloc 関数は、成功するなら、割り付けられたメモリへのポインタを 返します。そうでなければ、NULL ポインタが返され、errno が設定されます。 aligned_alloc 関数は、次の場合に失敗します: EINVAL alignment パラメータが、2 のべき乗ではありません。 ENOMEM メモリ割り付けエラー。 realloc 関数は、成功するなら、割り付けられたメモリへの (たぶん、ptr と 同一の) ポインタを返します。そうでなければ、NULL ポインタが返され、エ ラーが割り付け失敗の結果であったなら、errno は、ENOMEM に設定されます。 realloc 関数は、エラーが生じるとき、常に元のバッファのままにしておきま す。 free 関数は、値を返しません。 非標準 API mallocx と rallocx 関数は、成功するなら、割り付けられたメモリへのポイン タを返します。そうでなければ、十分に連続しているメモリが割り付け要求を サービスするのに利用可能でなかったことを示すために、NULL ポインタが返さ れます。 xallocx 関数は、割り付けがインプレース (入力データを直接書き換える) で 適切に成長することができないなら、size 未満で値である、ptr によって指さ れる結果のリサイズされた割り付けの実際のサイズを返します。 sallocx 関数は、ptr によって指される割り付けの実際のサイズを返します。 nallocx は、成功した等価な mallocx 関数呼び出しの結果となる実際のサイズ を返し、十分なメモリがサイズ計算を行なうのに利用可能でないなら、0 を返 します。 mallctl, mallctlnametomib と mallctlbymib 関数は、成功すれば、0 を返し ます。そうでなければ、それらは、エラー値を返します。関数は、次の場合に 失敗します: EINVAL newp が NULL ではなく、newlen が大きすぎるか、または小さすぎます。 また、*oldlenp が大きすぎるか、または小さすぎます。この場合、データ は、エラーにもかかわらずできるだけ読み込まれます。 ENOENT name または mib が、未知の値/無効の値を指定しています。 EPERM 無効の値を読み込むかまたは書き込を試みたか、または読み込み専用の値 に書き込む試みをしました。 EAGAIN メモリ割り付けの失敗が生じました。 EFAULT 副作用があるインタフェースが、mallctl* 読み込み/書き込み処理と直接 関係しないある方法に失敗しました。 malloc_usable_size 関数は、ptr によって指される割り付けの使用可能なサイ ズを返します。 環境変数 次の環境変数は、割り付け関数の実行に影響します: MALLOC_CONF 環境変数 MALLOC_CONF が設定されるなら、それが含んでいる文字は、オプ ションとして解釈されます。 使用例 問題が生じるときはいつでもコアダンプするためには: ln -s 'abort:true' /etc/malloc.conf 16 MiB であるソースのチャンクサイズを指定するためには: malloc_conf = "lg_chunk:24"; 関連項目 madvise(2), mmap(2), sbrk(2), utrace(2), alloca(3), atexit(3), getpagesize(3) 規格 malloc, calloc, realloc と free 関数は、ISO/IEC 9899:1990 ("ISO C90") に適合しています。 posix_memalign 関数は、IEEE Std 1003.1-2001 ("POSIX.1") に適合していま す。 歴史 malloc_usable_size と posix_memalign 関数は、FreeBSD 7.0 ではじめて登場 しました。 aligned_alloc, malloc_stats_print と mallctl* 関数は、FreeBSD 10.0 では じめて登場しました。 *allocx 関数は、FreeBSD 11.0 ではじめて登場しました。 作者 Jason Evans 注 1. jemalloc ウェブサイト http://www.canonware.com/jemalloc/ 2. Valgrind http://valgrind.org/ 3. gperftools パッケージ http://code.google.com/p/gperftools/ jemalloc 4.2.1-0-g3de035335255 06/08/2016 JEMALLOC(3)