Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 拡張編


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

JavaヒープからExplicitメモリブロックへのオブジェクトの移動では,Explicitメモリブロック内にあるオブジェクトから参照されているJavaヒープ内のオブジェクトが,自動でExplicitメモリブロックへ移動します。このため,移動するオブジェクトと関係を持つオブジェクトに対して,JavaヒープからExplicitメモリブロックへ移動する設定を作り込む必要はありません。ただし,-XX:+ExplicitMemoryUseExcludeClassオプションを指定した場合,明示管理ヒープ機能適用除外設定ファイルに記述されたクラスのオブジェクトは,Explicitメモリブロックへ移動しません。

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

参考

FullGCの発生時,大量のオブジェクトがExplicitヒープに移動したあとに次の現象が発生する場合は,参照関係に基づく移動の対象となるオブジェクトをExplicitメモリブロックへ移動しないようにする運用を検討してください。

  • Explicitメモリブロックの自動解放処理に時間が掛かる

  • Tenured領域の使用量が少ない

Explicitメモリブロックへオブジェクトを移動しないためには,次の機能を使用します。

  1. Explicitメモリブロックへのオブジェクト移動制御機能

  2. 明示管理ヒープ機能適用除外クラス指定機能

1.の機能は,FullGC発生時にオブジェクトをExplicitヒープへ移動しない機能であり,Explicitメモリブロックの自動解放処理に掛かる時間を短縮できます。また,2.の機能は,CopyGC発生時に設定ファイルに指定したクラスのオブジェクトをExplicitヒープへ移動しない機能であり,指定するクラスによってはExplicitヒープへ移動するオブジェクトの量を少なくできます。なお,2.の機能を使用すると,1.の機能も有効になります。2.の機能は,1.の機能を利用しても,Explicitヒープへのオブジェクトの移動が多く,Explicitメモリブロックの自動解放処理に時間が掛かるような場合に利用します。

〈この項の構成〉

(1) 実行契機

CopyGC,およびFullGCが発生したタイミングで実行されます。

(2) 実行される内容

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

これらの規則に従ったオブジェクトの移動の流れを図7-10および図7-11で例を使って説明します。なお,ここで説明するオブジェクトの移動の流れは,-XX:ExplicitMemoryFullGCPolicyオプションに0を指定していることを前提としています。

図7‒10 参照関係に基づいて移動するオブジェクト(例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についてもこのままとなります。

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

    [図データ]

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

  1. オブジェクト13は,Javaヒープ内にあり,またExplicitメモリブロック2内のオブジェクトから到達できます。しかし,オブジェクト12の時点で調査が打ち切られているため,移動しません。

  2. オブジェクト15は,オブジェクト13と同様にMetaspace領域からの参照があります。しかし,この参照に加え,Explicitメモリブロック2内のオブジェクトからMetaspace領域やほかのExplicitメモリブロックを介さずに到達できます。そのため,Explicitメモリブロック2に移動します。

  3. オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されていますが,Explicitメモリブロック1に移動します。

    なお,オブジェクト5はExplicitメモリブロック1,およびExplicitメモリブロック2の両方から参照されています。このような場合,Explicitメモリブロック1または2のどちらかに移動しますが,どちらのExplicitメモリブロックに移動するかは未定義です。

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