8.3 明示管理ヒープ機能で使用するメモリ空間の概要

この節では,明示管理ヒープ機能で使用するメモリ空間であるExplicitヒープの構造について説明します。なお,JavaVMで使用するメモリ空間の構成については,マニュアル「アプリケーションサーバ システム設計ガイド」の「7.2.6 SerialGC使用時のJavaVMで使用するメモリ空間の構成とJavaVMオプション」もあわせて参照してください。

Explicitヒープは,GCの対象にならないメモリ空間です。複数のメモリブロックで構成されます。Explicitヒープを構成するメモリブロックをExplicitメモリブロックといいます。Explicitヒープは,Explicitメモリブロック全体を表す概念です。

初期化や解放などの操作は,Explicitメモリブロック単位で実行します。

Explicitヒープの概念を次の図に示します。

図8-4 Explicitヒープの概念

[図データ]

Explicitヒープの最大サイズは,JavaVM起動オプションの-XX:HitachiExplicitHeapMaxSizeオプションで設定します。-XX:HitachiExplicitHeapMaxSizeオプションの詳細については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「-XX:HitachiExplicitHeapMaxSize(Explicitメモリブロックの最大サイズ指定オプション)」を参照してください。生成(初期化)できるExplicitメモリブロックの数は,最大1,048,575個です。この数を超えて生成することはできません。

メモリを確保する方法には,JavaVM起動時に一括してメモリ領域を確保する方法,および必要になったタイミングでメモリ領域を確保する方法の2種類があります。それぞれについて説明します。

JavaVM起動時に一括してメモリ領域を確保する方法
明示管理ヒープ機能の自動配置機能を使用している場合(-XX:+HitachiAutoExplicitMemoryオプションを指定している場合),または64ビット版のアプリケーションサーバを使用している場合が該当します。
-XX:HitachiExplicitHeapMaxSizeオプションで指定したExplicitヒープの最大サイズの実メモリ領域が,JavaVMを起動したタイミングで確保されます。領域は,JavaヒープおよびMetaspace領域からの連続領域として確保されます。
JavaオブジェクトをExplicitメモリブロックに配置するために必要なメモリが不足している場合,JavaVM起動時に確保したExplicitヒープの領域から,Explicitメモリブロック向けのメモリ領域を確保します。このため,Explicitメモリブロック内のメモリ領域は複数の領域に分かれていることがあります。
仮想メモリ空間の利用イメージを次の図に示します。

図8-5 仮想メモリ空間の利用イメージ(64ビット版の場合)

[図データ]
Explicitヒープ用の領域は連続領域になりますが,一つのExplicitメモリブロックで使用する領域が,非連続になります。
必要になったタイミングでメモリ領域を確保する方法
明示管理ヒープ機能の自動配置機能を使用していない場合(-XX:-HitachiAutoExplicitMemoryオプションを指定している場合),かつ32ビット版のアプリケーションサーバを使用している場合が該当します。
この場合,メモリ確保は一括で行われません。Explicitメモリブロックがメモリを必要とした時点で確保されます。このため,Explicitヒープは非連続領域になります。
オブジェクトをExplicitメモリブロックに配置するために必要なメモリが不足している場合,OSから随時メモリ領域が確保されます。このため,Explicitメモリブロック内のメモリ領域も複数の領域に分かれていることがあります。
仮想メモリ空間の利用イメージを次の図に示します。

図8-6 仮想メモリ空間の利用イメージ(32ビット版の場合)

[図データ]
Explicitヒープ用の領域および一つのExplicitメモリブロックで使用する領域が,非連続になります。