メモリー・モデルの変更 (32 ビット JVM)

32 ビットの JVM では 3 つのメモリー・モデルを使用できます。

AIX® メモリー・モデルについて詳しくは、ご使用のリリースの AIXの資料を参照してください。 例: ラージ・プログラム・サポート

小さなメモリー・モデル

アプリケーションのデフォルトのスモールメモリモデルでは、アプリケーションにはセグメント2という1つのセグメントしかなく、malloc()データを収集して追加のスレッドスタックを割り当てられます。 ただし、データをmmap()またはshmat()入れられる11セグメントの共有メモリーがあります。

大きなメモリー・モデル

malloc()を使用して割り当てられるデータの単一セグメントでは不十分な場合があるため、プライベートメモリと共有メモリの境界を移動して、アプリケーションにより多くのプライベートメモリを提供できますが、共有メモリの量は削減されます。 境界の移動は、アプリケーションの Executable Common Object File Format (XCOFF) ヘッダーにある o_maxdata 設定を変更することによって行います。

o_maxdata 設定は、以下のようにして変更できます。
  • ld コマンドで -bmaxdata フラグを使用して、コンパイル時に o_maxdata の値を設定します。
  • LDR_CNTRL=MAXDATA=0xn0000000 (n セグメント) 環境変数を使用して o_maxdata 値を設定します。

非常に大きなメモリー・モデル

非常に大きなメモリー・モデルは、MAXDATA 設定の最後に「@DSA」を追加するとアクティブ化されます。 これには、以下の 2 つの追加機能があります。
  • 単一のセグメントと MAXDATA 設定で指定したセグメントの間での専用メモリーと共有メモリーの境界の動的移動。 この動的な移動は、プライベートメモリをセグメント3から上向きに割り当て、共有メモリをセグメントCから下向きに割り当てることによって実現されます。 セグメントがshmatまたはmmapルーチンに使われない場合、プライベートメモリ領域は新しいセグメントに上向きに拡張できます。
  • 共有ライブラリーをプロセスの専用域にロードする機能。 0 または 0xAFFFFFFF より大きい MAXDATA 値を指定した場合、プロセスはグローバル共有ライブラリーを使用せずに、それらを専用のものとしてロードします。 その結果、shmat プロシージャーおよび mmap プロシージャーは、より上のセグメントでの割り振りを開始します。それらが現在では共有ライブラリー用に予約されていないためです。 このようにして、プロセスはより連続的なメモリーを取得します。
MAXDATA 設定の変更は、32 ビット・プロセスにのみ適用され、64 ビットの JVM には適用されません。