8.6.5 参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動

JavaヒープからExplicitメモリブロックへのオブジェクトの移動では,Explicitメモリブロック内にあるオブジェクトから参照されているJavaヒープ内のオブジェクトが,自動でExplicitメモリブロックへ移動します。このため,移動するオブジェクトと関係を持つオブジェクトに対して,JavaヒープからExplicitメモリブロックへ移動する設定を作り込む必要はありません。

なお,参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動は,自動配置機能で作成したExplicitメモリブロックが対象となります。明示管理ヒープAPIで作成したExplicitメモリブロックは対象外です。

<この項の構成>
(1) 実行契機
(2) 実行される内容

(1) 実行契機

コピーガーベージコレクション,およびフルガーベージコレクションが発生したタイミングで実行されます。

(2) 実行される内容

コピーガーベージコレクションまたはフルガーベージコレクションの処理が終了したあと,JavaVMによって解放予約されていないExplicitメモリブロックがあるかどうか調査されます。調査の基点となるオブジェクトから参照関係を調べ,参照先がなくなるまで調査を続けます。参照関係を調査する際,Javaヒープ外の領域は調査対象外です。また,Explicitメモリブロックから参照されているオブジェクトは移動対象のオブジェクトとなります。

ただし,コピーガーベージコレクションが実行された場合には,これらに加えて次の規則に従って動作します。

これらの規則に従ったオブジェクトの移動の流れを図8-11および図8-12で例を使って説明します。

図8-11 参照関係に基づいて移動するオブジェクト(例1)

[図データ]

図中のオブジェクトは次の順番に動作します。

  1. オブジェクト1は,Explicitメモリブロック1内のオブジェクトから参照されています。そのため,オブジェクト1はExplicitメモリブロック1へ移動します。
  2. オブジェクト9も,オブジェクト1から参照されているためExplicitメモリブロック1に移動します。
  3. 1.および2.の処理と同様に,オブジェクト4,オブジェクト10,およびオブジェクト11はExplicitメモリブロック2へ移動します。
  4. オブジェクト6は,Explicitメモリブロック2内のオブジェクトから参照されています。しかし,Javaヒープ内のオブジェクトではないためこのままとなります。
  5. 4.と同様に,オブジェクト12についてもこのままとなります。

    図8-12 参照関係に基づいて移動するオブジェクト(例2)

    [図データ]

図中のオブジェクトは次の順番に動作します。

  1. オブジェクト13は,Javaヒープ内にあり,またExplicitメモリブロック2内のオブジェクトから到達できます。しかし,オブジェクト12の時点で調査が打ち切られているため,移動しません。
  2. オブジェクト15は,オブジェクト13と同様にPerm領域内からの参照があります。しかし,この参照に加え,Explicitメモリブロック2内のオブジェクトからPerm領域やほかのExplicitメモリブロックを介さずに到達できます。そのため,Explicitメモリブロック2に移動します。
  3. オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されていますが,Explicitメモリブロック1に移動します。
    なお,オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されています。このような場合,Explicitメモリブロック1または2のどちらかに移動しますが,どちらのExplicitメモリブロックに移動するかは未定義です。

また,次の条件に該当する場合は,例で説明した動作と異なります。