JavaヒープからExplicitメモリブロックへのオブジェクトの移動では,Explicitメモリブロック内にあるオブジェクトから参照されているJavaヒープ内のオブジェクトが,自動でExplicitメモリブロックへ移動します。このため,移動するオブジェクトと関係を持つオブジェクトに対して,JavaヒープからExplicitメモリブロックへ移動する設定を作り込む必要はありません。
なお,参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動は,自動配置機能で作成したExplicitメモリブロックが対象となります。明示管理ヒープAPIで作成したExplicitメモリブロックは対象外です。
- <この項の構成>
- (1) 実行契機
- (2) 実行される内容
コピーガーベージコレクションまたはフルガーベージコレクションの処理が終了したあと,JavaVMによって解放予約されていないExplicitメモリブロックがあるかどうか調査されます。調査の基点となるオブジェクトから参照関係を調べ,参照先がなくなるまで調査を続けます。参照関係を調査する際,Javaヒープ外の領域は調査対象外です。また,Explicitメモリブロックから参照されているオブジェクトは移動対象のオブジェクトとなります。
ただし,コピーガーベージコレクションが実行された場合には,これらに加えて次の規則に従って動作します。
- 参照されているExplicitメモリブロック内のオブジェクトが昇格するタイミングで移動します。
- Permヒープ,およびExplicitヒープ,およびTenured領域への参照についても調査対象としません。
- Explicitメモリブロックが解放予約されている場合でも,移動対象として扱います。
Explicitメモリブロックの領域が確保できず,オブジェクトがJavaヒープに移動するときに,移動先のJavaヒープに空き領域がなくなり,移動できなくなった場合が該当します。この場合は,フルガーベージコレクションが実行され,Javaヒープに空き領域が確保されます。フルガーベージコレクション実行後,Javaヒープへのオブジェクトの移動が実行されます。
これらの規則に従ったオブジェクトの移動の流れを図8-11および図8-12で例を使って説明します。
図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と同様にPerm領域内からの参照があります。しかし,この参照に加え,Explicitメモリブロック2内のオブジェクトからPerm領域やほかの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レベルの例外が発生することがあります。詳細は,マニュアル「Cosminexus アプリケーションサーバ リファレンス API編」の「13.7 例外クラス」を参照してください。