自動配置機能で作成したExplicitメモリブロックにあるオブジェクトから参照されているオブジェクトは,GC発生時にJavaヒープからExplicitヒープへ参照関係に基づいて移動します。明示管理ヒープ機能適用除外クラス指定機能は,設定ファイルを使って,この参照関係に基づく移動の対象となるオブジェクトを明示管理ヒープ機能の適用対象から除外し,Explicitヒープへ移動させないようにします。この機能を使用すると,アプリケーションの停止まで使用されるオブジェクトなど,FullGCでも回収されないオブジェクトを,明示管理ヒープ機能の適用対象から除外できます。オブジェクトの参照関係に基づいた移動については「8.6.5 参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動」を参照してください。
明示管理ヒープ機能適用除外クラス指定機能で使用するファイルには,次の2種類があります。
Explicitヒープへ移動させたくないオブジェクトのクラスを指定します。このファイルに指定したクラスのオブジェクトは,GCが発生しても,Explicitヒープへ移動しません。昇格するタイミングでTenured領域へ移動します。
明示管理ヒープ機能適用除外設定ファイルには,システムで提供しているファイルがあります。明示管理ヒープ機能適用除外クラス指定機能を有効にすると,システムで提供している明示管理ヒープ機能適用除外設定ファイルが使用されます。システムで提供している明示管理ヒープ機能適用除外設定ファイルのファイルパスを次に示します。
明示管理ヒープ機能の適用対象から除外するクラスを追加したい場合は,次のファイルパスにあるファイルを更新するか,または新たなファイルを作成してください。
なお,新たに明示管理ヒープ機能適用除外設定ファイルを作成した場合は,-XX:ExplicitMemoryExcludeClassListFileオプションにファイルパスを指定してください。
明示管理ヒープ機能適用除外設定ファイルに指定したクラスのうち,適用除外設定を無効にしたいクラスを指定します。このファイルに指定したクラスのオブジェクトは,GCが発生すると,Explicitヒープへ移動します。
明示管理ヒープ機能の適用対象から除外されているクラスを無効にしたい場合は,次のファイルパスにあるファイルを更新するか,または新たなファイルを作成してください。システムで提供している明示管理ヒープ機能適用除外設定ファイルに指定されているクラスも設定を無効にできます。
なお,新たに明示管理ヒープ機能適用除外無効設定ファイルを作成した場合は,-XX:ExplicitMemoryNotExcludeClassListFileオプションにファイルパスを指定してください。
明示管理ヒープ機能適用除外無効設定ファイルの指定は,明示管理ヒープ機能適用除外設定ファイルの指定よりも優先されます。
パッケージ「com.sample」を例に,設定ファイルの指定と明示管理ヒープ機能の適用範囲について説明します。パッケージ「com.sample」には,ClassAとClassBの二つのクラスがあります。各設定ファイルを次のように指定します。
com.sample.* |
com.sample.ClassB |
明示管理ヒープ機能適用除外設定ファイルの指定には,ClassAとClassBの両方が含まれています。しかし,明示管理ヒープ機能適用除外無効設定ファイルの指定が優先されるため,次の図のように,明示管理ヒープ機能の適用が除外されるのはClassAだけとなり,ClassBには明示管理ヒープ機能が適用されます。
設定ファイルの記述形式を次に示します。
<指定したクラスの完全修飾クラス名>※#コメント |
注※ クラス名は,「*」を使用すると省略できます。
<配列の次元数分の"[">※L<指定したクラスの完全修飾クラス名>; |
注※ 多次元配列のときは,「[」を次元数分続けて指定します。3次元配列の場合は「[[[」となります。
明示管理ヒープ機能適用除外設定ファイル,および明示管理ヒープ機能適用除外無効設定ファイルの記述例を次に示します。
なお,ここで説明する記述例は,パッケージ名が「com.sample」で,次の図に示すクラス構造とします。
図8-27 クラス構造の例
完全修飾クラス名で指定する場合の明示管理ヒープ機能適用除外設定ファイルの記述例を次に示します。
com.sample.aaa.ClassA |
この例では,ClassAクラス,ClassCクラス,およびClassDクラスのオブジェクトがTenured領域へ移動します。
クラス名を省略して指定する場合の明示管理ヒープ機能適用除外設定ファイル,および明示管理ヒープ機能適用除外無効設定ファイルの記述例を次に示します。
com.sample.* |
com.sample.aaa.ClassB |
この例では,明示管理ヒープ機能適用除外設定ファイルの記述から,同一パッケージ内のクラスだけでなく,サブパッケージに存在するクラスも含めすべてのクラスがTenured領域への移動対象となります。しかし,明示管理ヒープ機能適用設定ファイルの記述から,ClassBクラスとClassEクラスのオブジェクトがExplicitメモリブロックへの移動対象となります。このため,ClassAクラス,ClassCクラス,およびClassDクラスのオブジェクトがTenured領域へ移動します。