8.6.1 Explicitメモリブロックのライフサイクルと状態
ここでは,Explicitメモリブロックのライフサイクルと状態について説明します。
明示管理ヒープ機能では,Explicitメモリブロックを解放する方法として,次の2種類の解放処理があります。
- Explicitメモリブロックの自動解放処理(自動解放機能が有効な場合に実行される解放処理)
- Explicitメモリブロックの明示解放処理(自動解放機能が無効な場合に実行される解放処理)
Explicitメモリブロックの解放処理が異なることで,指定方法や処理が異なります。8.7以降で,解放処理ごとに詳しく説明します。
- <この項の構成>
- (1) Explicitメモリブロックのライフサイクル
- (2) Explicitメモリブロックの状態
(1) Explicitメモリブロックのライフサイクル
Explicitメモリブロックのライフサイクルを次の図に示します。
図8-10 Explicitメモリブロックのライフサイクル
![[図データ]](figure/zu080800.gif)
図に示したライフサイクルの各段階について説明します。
- Explicitメモリブロックの初期化とExplicitメモリブロックの無効化
- Explicitメモリブロックの初期化が実行され,Explicitメモリブロックが生成されます。
- HTTPセッションに関するオブジェクトまたはリダイレクタとの通信用オブジェクトを格納するExplicitメモリブロックは,Webコンテナによって初期化されます。
- アプリケーションで任意のオブジェクトをExplicitヒープに配置する場合は,明示管理ヒープ機能APIを使用して,明示的にExplicitメモリブロックを初期化します。
- なお,初期化実行時の状態によっては,Explicitメモリブロックが無効化されることがあります。
- Explicitメモリブロックの初期化で実行される処理,およびExplicitメモリブロックが無効化される条件については,「8.6.2 Explicitメモリブロックの初期化」で説明します。
- Explicitメモリブロックへのオブジェクトの生成
- アプリケーションで任意のオブジェクトをExplicitメモリブロックに格納する場合,明示管理ヒープ機能APIを使用して,オブジェクトをExplicitメモリブロックに生成,配置します。
- Explicitメモリブロックへのオブジェクトの生成については,「8.6.3 Explicitメモリブロックへのオブジェクトの直接生成」で説明します。
- Explicitメモリブロックの拡張
- 利用中にオブジェクトを配置する領域が不足した場合,JavaVMによってExplicitメモリブロックの拡張が実行されます。
- Explicitメモリブロックの拡張については,「8.6.4 Explicitメモリブロックの拡張」で説明します。
- Explicitメモリブロックの解放予約と解放処理
- Explicitメモリブロックの解放予約と解放処理は,明示管理ヒープ機能の自動解放機能の有効(-XX:+HitachiExplicitMemoryAutoReclaim)・無効(-XX:-HitachiExplicitMemoryAutoReclaim)で挙動が異なります。
- 自動解放機能が有効な場合(-XX:+HitachiExplicitMemoryAutoReclaim)
- なお,javagcコマンドを使用すると,解放されていないExplicitメモリブロックに対して,任意のタイミングで解放処理を実行できます。javagcコマンドによるExplicitメモリブロックの解放処理については,「8.9 javagcコマンドによるExplicitメモリブロックの解放」を参照してください。
- 自動解放機能が無効な場合(-XX:-HitachiExplicitMemoryAutoReclaim)
- Explicitメモリブロックの明示解放予約
Explicitメモリブロックに配置したオブジェクトが不要になった場合は,Explicitメモリブロック単位で解放を予約します。
- HTTPセッションに関するオブジェクトまたはリダイレクタとの通信用オブジェクトを格納したExplicitメモリブロックは,Webコンテナによって解放が予約されます。
- アプリケーションで任意のオブジェクトをExplicitメモリブロックに格納した場合は,明示管理ヒープ機能APIを使用して,明示的にExplicitメモリブロックの解放を予約します。
- 自動解放機能が無効な場合のExplicitメモリブロックの明示解放予約については,「8.8.1 自動解放機能が無効な場合のExplicitメモリブロックの明示解放予約」を参照してください。なお,明示解放予約を実行した段階では,まだExplicitメモリブロックは破棄されていません。
- Explicitメモリブロックの解放処理
解放が予約されたExplicitメモリブロックは,CopyGCまたはFullGCが発生したタイミングで,JavaVMによって解放されます。同時にExplicitメモリブロックに配置したオブジェクトも破棄されます。ただし,一部のオブジェクトは破棄されないで,Javaヒープに移動します。
自動解放機能が無効な場合のExplicitメモリブロックの解放処理については,「8.8.2 自動解放機能が無効な場合のExplicitメモリブロックの解放処理」を参照してください。
(2) Explicitメモリブロックの状態
Explicitメモリブロックは,ライフサイクルの各段階で,有効,解放済み,解放予約済みなどの状態に遷移します。
さらに,有効な状態のExplicitメモリブロックは,次の表に示すサブ状態を保持します。
表8-5 Explicitメモリブロックのサブ状態
サブ状態 | Explicitメモリブロックの状態 |
---|
Enable | 初期状態です。Explicitメモリブロックのすべての機能が使用できます。 |
Disable | 該当するExplicitメモリブロックにJavaオブジェクトを移動できない状態です。Explicitメモリブロックを拡張したときに,この状態になることがあります。 |