7.10.2 自動解放処理に掛かる時間を短縮する仕組み
明示管理ヒープ機能では,長寿命オブジェクトのうち,一定期間で不要となるオブジェクトをExplicitヒープに配置して解放処理で回収することで,FullGCの発生を抑止しています。また,Explicitヒープに配置したオブジェクトと参照関係にあるオブジェクトは,生存期間が一致しやすいことから,JavaヒープからExplicitメモリブロックへ参照関係に基づいて移動し,Explicitヒープでまとめて管理する仕組みになっています。
しかし,運用によっては,Explicitメモリブロックへ移動したオブジェクトが,Explicitメモリブロックのサイズを巨大化させ,それが原因で自動解放処理が長時間化することがあります。Explicitメモリブロックの自動解放処理中はシステムが停止するため,自動解放処理の長時間化がシステム上問題となることがあります。巨大なサイズのExplicitメモリブロックのことを巨大ブロックといいます。参照関係に基づいた移動によって,寿命の異なるオブジェクトが一つのブロックに移動し,この繰り返しによってブロックは巨大化します。参照関係が複雑で,アプリケーション開発者が参照関係を把握できないような場合に,巨大ブロックが発生しやすくなります。
- 注意事項
-
Javaオブジェクトには,次の表に示す種類があります。Javaオブジェクトの種類によってその寿命は異なり,Explicitヒープに配置するのが適切なものと適切でないものがあります。
表7‒8 Javaオブジェクトの種類 項番
分類
オブジェクトの種別
解放されるタイミング
配置に適切なメモリ領域
1
短寿命オブジェクト
リクエスト処理やレスポンス処理など一時的に利用するオブジェクト
CopyGC発生時
Javaヒープ(New領域)※1
2
長寿命オブジェクト
一定期間で不要となるオブジェクト
自動解放処理時
Explicitヒープ
3
アプリケーションの動作に必要でアプリケーションの停止まで使用されるオブジェクト
アプリケーション停止時
Javaヒープ(Tenured領域)※2
機能を利用しない場合と利用する場合の比較によって,自動解放処理に掛かる時間を短縮する仕組みを説明します。
- 〈この項の構成〉
(1) Explicitメモリブロックへのオブジェクト移動制御機能と,明示管理ヒープ機能適用除外クラス指定機能を利用していない場合
Explicitメモリブロックへのオブジェクト移動制御機能と,明示管理ヒープ機能適用除外クラス指定機能を利用しない場合の仕組みについて説明します。オブジェクトを参照関係に基づいて移動するExplicitメモリブロックが三つある場合の例を次の図に示します。
Explicitメモリブロックへのオブジェクト移動制御機能と,明示管理ヒープ機能適用除外クラス指定機能を利用していない場合は,GCが発生したときに,オブジェクトは参照関係に基づいてJavaヒープからExplicitメモリブロックへ移動します。Explicitメモリブロック1の場合,移動したオブジェクトがアプリケーションの停止まで使用されるオブジェクトであり,自動解放処理で回収されないため,Explicitメモリブロックに残り続けます。この図に示す段階では,Explicitメモリブロック1のオブジェクトの総サイズは巨大でないため,問題はありません。しかし,オブジェクトの参照関係によっては,GCが発生するたびに,参照先のオブジェクトが参照関係に基づいてExplicitメモリブロックへ移動します。この参照関係に基づいた移動がアプリケーション停止時まで続くことで,Explicitメモリブロック1は巨大ブロックとなるおそれがあります。Explicitメモリブロック2の場合,移動したオブジェクトが巨大サイズであるため,巨大ブロックとなります。このようにExplicitヒープに適切でないオブジェクトが多量に配置されると,Explicitメモリブロックが巨大ブロックとなり,自動解放処理が長時間化します。
(2) Explicitメモリブロックへのオブジェクト移動制御機能を利用している場合
Explicitメモリブロックへのオブジェクト移動制御機能を利用している場合の仕組みについて説明します。オブジェクトを参照関係に基づいて移動するExplicitメモリブロックが三つある場合の例を次の図に示します。
Explicitメモリブロックへのオブジェクト移動制御機能を利用している場合,FullGCが発生しても,オブジェクトはJavaヒープからExplicitメモリブロックへ参照関係に基づいた移動をしません。この機能を利用すると,Javaヒープに配置するオブジェクトが増加するため,Javaヒープ領域のメモリサイズの再設定が必要となる場合もあります。
なお,この機能を利用しても,巨大ブロックが生成される場合は,明示管理ヒープ機能適用除外クラス指定機能を利用します。
(3) Explicitメモリブロックへのオブジェクト移動制御機能に加えて明示管理ヒープ機能適用除外クラス指定機能を利用している場合
Explicitメモリブロックへのオブジェクト移動制御機能に加えて明示管理ヒープ機能適用除外クラス指定機能を利用している場合の仕組みについて説明します。オブジェクトを参照関係に基づいて移動するExplicitメモリブロックが三つある場合の例を次の図に示します。ここでは,Explicitメモリブロック1とExplicitメモリブロック2に移動するオブジェクトのクラスが,明示管理ヒープ機能適用外設定ファイルに設定されているとします。
明示管理ヒープ機能適用除外クラス指定機能を利用している場合,明示管理ヒープ機能適用除外設定ファイルに指定したクラスのオブジェクトは,明示管理ヒープ機能の対象から除外され,CopyGCが発生しても,JavaヒープからExplicitメモリブロックへ移動しません。このオブジェクトは,昇格するタイミングでTenured領域へ移動します。この機能を利用すると,Javaヒープに配置するオブジェクトが増加するため,Javaヒープ領域のメモリサイズの再設定が必要となる場合もあります。
明示管理ヒープ機能適用除外クラス指定機能で利用する,明示管理ヒープ機能適用除外設定ファイルには,次の2種類があります。
-
システムで提供している明示管理ヒープ機能適用除外設定ファイル(sysexmemexcludeclass1100.cfg)
-
-XX:ExplicitMemoryExcludeClassListFileオプションにファイルパスを指定した,明示管理ヒープ機能適用除外設定ファイル(exmemexcludeclass.cfg,または任意のファイル名)
明示管理ヒープ機能適用除外クラス指定機能を利用する設定を(-XX:+ExplicitMemoryUseExcludeClassオプションを指定)すると,sysexmemexcludeclass1100.cfgに設定されているクラスは,自動的に明示管理ヒープ機能適用除外対象となり,そのクラスのオブジェクトはExplicitヒープへ移動しません。さらに適用除外対象のオブジェクトを指定したい場合は,exmemexcludeclass.cfg,または任意のファイル名の明示管理ヒープ機能適用除外設定ファイルに,適用除外対象のオブジェクトのクラスを指定します。また,sysexmemexcludeclass1100.cfgに設定されているクラスのオブジェクトに対して明示管理ヒープ機能を適用したい場合は,明示管理ヒープ機能適用除外無効設定ファイル(exmemnotexcludeclass.cfg)にそのクラスを指定します。このため,設定ファイルに指定するクラスによっては,Explicitヒープへ移動するオブジェクトを少なくできます。明示管理ヒープ機能適用除外クラスは,スレッドダンプに出力されるExplicitヒープ情報のオブジェクト解放率を参考に指定します。オブジェクト解放率については,「7.10.3 Explicitメモリブロックのオブジェクト解放率情報の利用」を参照してください。
なお,参照経路が明示管理ヒープ機能適用除外対象のオブジェクトを経由するオブジェクトのうち,明示管理ヒープ機能適用除外対象のオブジェクト以外の経路から参照されないオブジェクトも明示管理ヒープ機能適用除外対象となります。明示管理ヒープ機能適用除外対象のオブジェクトからの参照経路が複数ある場合の例を次の図に示します。
この図の場合,オブジェクトBは明示管理ヒープ機能適用除外対象のオブジェクトです。オブジェクトBを経由する参照経路には,次のものがあります。
-
A→B→C1
-
A→B→C2
-
A→B→C3
このうち,オブジェクトC1にはD→C1,オブジェクトC3にはE→C3の参照経路があるため,これらのオブジェクトは参照関係に基づいてExplicitメモリブロックへ移動します。一方,オブジェクトC2はオブジェクトBを経由する以外の参照経路がないため,明示管理ヒープ機能適用除外対象となってExplicitメモリブロックへ移動しません。