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