メモリー・モデルの変更 (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 プロシージャーは、より上のセグメントでの割り振りを開始します。それらが現在では共有ライブラリー用に予約されていないためです。 このようにして、プロセスはより連続的なメモリーを取得します。