7.7.3 自動解放機能が有効な場合のExplicitメモリブロックの解放処理
自動解放機能が有効な場合のExplicitメモリブロックの解放処理は,事前に自動解放予約,および明示解放予約で予約されているExplicitメモリブロックに対して実行されます。不要になったExplicitメモリブロックは,解放処理によってメモリから削除されます。
なお,外部(解放対象外のExplicitメモリブロック)から参照されているオブジェクトがある場合,オブジェクトは新規のExplicitメモリブロックに移動されます。
- 〈この項の構成〉
(1) 実行契機
自動解放予約で解放予約が実行されるのと同じGCで,JavaVMによって実行されます。
(2) 実行される内容
実行される内容は,解放対象外のExplicitメモリブロックから参照されているオブジェクトの挙動以外は,自動解放機能が無効な場合のExplicitメモリブロックの解放処理の処理内容と同じです。Explicitメモリブロックの解放処理で実行される内容については,「7.8.2 自動解放機能が無効な場合のExplicitメモリブロックの解放処理」を参照してください。
また,次の条件に該当する場合は動作が異なります。
-
Explicitメモリブロックの空き領域を確保できない場合
オブジェクトをExplicitメモリブロックに配置する際,配置先のExplicitメモリブロックに配置対象となるオブジェクトを配置する空き領域がない場合が該当します。この場合,Explicitメモリブロックにオブジェクトを配置できません。配置できなかったオブジェクトは,Javaヒープ領域へ配置されます。
-
Javaヒープへのオブジェクト移動時にJavaヒープがあふれた場合
Explicitメモリブロックの領域を確保できず,オブジェクトがJavaヒープに移動する場合に,移動先のJavaヒープに空き領域がなくなり,移動できなくなったときが該当します。この場合は,FullGCが実行され,Javaヒープに空き領域が確保されます。FullGC実行後,Javaヒープへのオブジェクトの移動が実行されます。
FullGCを実行してもJavaオブジェクトを移動するために必要な空き領域が確保できない場合は,ログファイルが出力され,オブジェクトが再度Explicitメモリブロックに配置されます。出力されるログファイルについては,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「4.19 明示管理ヒープ機能のイベントログ」を参照してください。
-
FullGCで十分な空き領域を作成できない場合
Javaヒープに空き領域がなくなり,FullGCを実行してもJavaオブジェクトを移動するために必要な空き領域が確保できない場合が該当します。この場合は,Cヒープ不足の場合と同様に,JavaVMがアボートします。ただし,Cヒープ不足時には「request nnn bytes」としてnnnに必要なメモリサイズが出力されますが,JavaVMのアボート時には,nnnとして常に「0」が出力されます。