AIX のフラグメント化の問題

ネイティブ・ヒープの枯渇は、 Inuse ページが 65535 Inuse ページに近づくことなく発生する可能性もあります。 これは、 AIX® malloc ヒープのフラグメント化が原因で発生することがあります。これは、 AIX が JVM のネイティブ・ヒープを処理する方法です。

この OutOfMemory 条件も、svmon のスナップショットから識別できます。 メモリー・リークに関してこれまで重要視していた列は、Inuse 値でした。 AIX malloc ヒープの問題の場合は、 「Addr Range」 列を確認することが重要です。 Inuse 列が現在使用 (コミット) されているページ数についての詳細を示すのに対し、Addr Range 列は割り振られたページについての詳細を示します。

割り振られたページが解放されたときに、それらのページがプロセスに戻らないことがあります。 ページが解放されないと、割り振られたページ数とコミットされているページ数の間に不一致が発生することになります。

malloc アルゴリズム自体の動作を変更し、このタイプの問題を解決するための各種の環境変数があります。
MALLOCTYPE=3.1
このオプションを使うと、システムは、メモリ割り当てが2の累乗で行われる従来バージョンのメモリ割り当てスキームに戻ることができます。 3.1 Malloc アロケーターは、デフォルト・アルゴリズムとは異なり、再利用のためにメモリーのページをシステムに解放します。 3.1 の割り振りポリシーは、32 ビット・アプリケーションでのみ使用することができます。
MALLOCMULTIHEAP=heaps:n、考慮事項のサイズ
デフォルトでは、malloc サブシステムは単一のヒープを使用します。 MALLOCMULTIHEAP を使用すると、ユーザーがメモリーの複数のヒープを使用できるようになります。 メモリーの複数のヒープを使用するということは、メモリーのフラグメント化が発生するということです。したがって、この環境変数の使用は避けるべきです。
MALLOCTYPE=buckets
Malloc バケットは、デフォルト・アロケーターのオプションのバケット・ベースの拡張機能を提供します。 これは、小さな割り振り要求を数多く発行するアプリケーションの malloc パフォーマンスを向上させることを目的としています。 malloc バケットを有効にすると、事前定義されたブロック・サイズ範囲に入る割り振り要求が malloc バケットによって処理されます。 メモリーの所要量および使用量はさまざまであるため、一部のアプリケーションでは、malloc バケットが使用するメモリー割り振り方式に利点がない場合があります。 したがって、malloc バケットをシステム全体で有効にすることはお勧めしません。 最良のパフォーマンスを得るためには、アプリケーション単位で malloc バケットを有効にし、構成してください。
注: これらのオプションは、パフォーマンスに一定の影響を与える可能性があります。 また、3.1 の malloc アロケーターは、Malloc Multiheap オプションおよび Malloc Buckets オプションをサポートしていません。
MALLOCBUCKETS= number_of_buckets:128,bucket_sizing_factor:64,blocks_per_bucket:1024: bucket_statistics: <path name of file for malloc statistics>
MALLOCTYPE=bucketsを参照してください。