JavaヒープからExplicitメモリブロックへのオブジェクトの移動では,Explicitメモリブロック内にあるオブジェクトから参照されているJavaヒープ内のオブジェクトが,自動でExplicitメモリブロックへ移動します。このため,移動するオブジェクトと関係を持つオブジェクトに対して,JavaヒープからExplicitメモリブロックへ移動する設定を作り込む必要はありません。ただし,-XX:+ExplicitMemoryUseExcludeClassオプションを指定した場合,明示管理ヒープ機能適用除外設定ファイルに記述されたクラスのオブジェクトは,Explicitメモリブロックへ移動しません。
なお,参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動は,自動配置機能で作成したExplicitメモリブロックが対象となります。明示管理ヒープAPIで作成したExplicitメモリブロックは対象外です。
- 参考
- FullGCの発生時,大量のオブジェクトがExplicitヒープに移動したあとに次の現象が発生する場合は,参照関係に基づく移動の対象となるオブジェクトをExplicitメモリブロックへ移動しないようにする運用を検討してください。
- Explicitメモリブロックの自動解放処理に時間が掛かる
- Tenured領域の使用量が少ない
- Explicitメモリブロックへオブジェクトを移動しないためには,次の機能を使用します。
- Explicitメモリブロックへのオブジェクト移動制御機能
- 明示管理ヒープ機能適用除外クラス指定機能
- 1.の機能は,FullGC発生時にオブジェクトをExplicitヒープへ移動しない機能であり,Explicitメモリブロックの自動解放処理に掛かる時間を短縮できます。また,2.の機能は,CopyGC発生時に設定ファイルに指定したクラスのオブジェクトをExplicitヒープへ移動しない機能であり,指定するクラスによってはExplicitヒープへ移動するオブジェクトの量を少なくできます。なお,2.の機能を使用すると,1.の機能も有効になります。2.の機能は,1.の機能を利用しても,Explicitヒープへのオブジェクトの移動が多く,Explicitメモリブロックの自動解放処理に時間が掛かるような場合に利用します。
- <この項の構成>
- (1) 実行契機
- (2) 実行される内容
CopyGCまたはFullGCの処理が終了したあと,JavaVMによって解放予約されていないExplicitメモリブロックがあるかどうか調査されます。調査の基点となるオブジェクトから参照関係を調べ,参照先がなくなるまで調査を続けます。参照関係を調査する際,Javaヒープ外の領域は調査対象外です。また,Explicitメモリブロックから参照されているオブジェクトは移動対象のオブジェクトとなります。
- CopyGCの場合
CopyGCが実行された場合には,これらに加えて次の規則に従って動作します。
- 参照されているExplicitメモリブロック内のオブジェクトが昇格するタイミングで移動します。
- Metaspace領域,Explicitヒープ,およびTenured領域への参照についても調査対象としません。
- Explicitメモリブロックが解放予約されている場合でも,移動対象として扱います。
Explicitメモリブロックの領域が確保できず,オブジェクトがJavaヒープに移動するときに,移動先のJavaヒープに空き領域がなくなり,移動できなくなった場合が該当します。この場合は,FullGCが実行され,Javaヒープに空き領域が確保されます。FullGC実行後,Javaヒープへのオブジェクトの移動が実行されます。
- FullGCの場合
FullGCが実行された場合には,これらに加えて次の規則に従って動作します。
- -XX:ExplicitMemoryFullGCPolicyオプションに1を指定した場合,参照関係に基づく移動の対象となるオブジェクトは,Explicitメモリブロックへ移動しません。なお,New領域にあるオブジェクトはTenured領域へ移動します。
これらの規則に従ったオブジェクトの移動の流れを図8-11および図8-12で例を使って説明します。なお,ここで説明するオブジェクトの移動の流れは,-XX:ExplicitMemoryFullGCPolicyオプションに0を指定していることを前提としています。
図8-11 参照関係に基づいて移動するオブジェクト(例1)
![[図データ]](figure/zu081800.gif)
図中のオブジェクトは次の順番に動作します。
- オブジェクト1は,Explicitメモリブロック1内のオブジェクトから参照されています。そのため,オブジェクト1はExplicitメモリブロック1へ移動します。
- オブジェクト9も,オブジェクト1から参照されているためExplicitメモリブロック1に移動します。
- 1.および2.の処理と同様に,オブジェクト4,オブジェクト10,およびオブジェクト11はExplicitメモリブロック2へ移動します。
- オブジェクト6は,Explicitメモリブロック2内のオブジェクトから参照されています。しかし,Javaヒープ内のオブジェクトではないためこのままとなります。
- 4.と同様に,オブジェクト12についてもこのままとなります。
図8-12 参照関係に基づいて移動するオブジェクト(例2)
![[図データ]](figure/zu081900.gif)
図中のオブジェクトは次の順番に動作します。
- オブジェクト13は,Javaヒープ内にあり,またExplicitメモリブロック2内のオブジェクトから到達できます。しかし,オブジェクト12の時点で調査が打ち切られているため,移動しません。
- オブジェクト15は,オブジェクト13と同様にMetaspace領域からの参照があります。しかし,この参照に加え,Explicitメモリブロック2内のオブジェクトからMetaspace領域やほかのExplicitメモリブロックを介さずに到達できます。そのため,Explicitメモリブロック2に移動します。
- オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されていますが,Explicitメモリブロック1に移動します。
なお,オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されています。このような場合,Explicitメモリブロック1または2のどちらかに移動しますが,どちらのExplicitメモリブロックに移動するかは未定義です。
また,次の条件に該当する場合は,例で説明した動作と異なります。
- Explicitメモリブロックの空き領域を確保できない場合
オブジェクトをExplicitメモリブロックに配置する際,配置先のExplicitメモリブロックに配置対象となるオブジェクトを配置する空き領域がない場合が該当します。この場合,Explicitメモリブロックにオブジェクトを配置できません。配置できなかったオブジェクトは,Javaヒープ領域へ配置されます。なお,APIの利用方法が誤っている場合,APIレベルの例外が発生することがあります。詳細は,マニュアル「アプリケーションサーバ リファレンス API編」の「10.7 例外クラス」を参照してください。