7.10.3 Explicitメモリブロックのオブジェクト解放率情報の利用
Explicitメモリブロックの自動解放処理が長時間化する要因となる巨大ブロックは,アプリケーションの停止まで使用される長寿命のオブジェクトがユーザプログラムやフレームワークの利用によって生成され,配置されることで生成されます。明示管理ヒープ機能を効果的に使用するためには,この巨大ブロックを生成する要因となるオブジェクトを特定して,Explicitヒープに配置しないようにすることが必要になります。
(1) Explicitメモリブロックのオブジェクト解放率情報の出力
巨大ブロックを生成する要因となるオブジェクトは,オブジェクト解放率情報を利用すると特定できます。オブジェクト解放率情報は,Explicitメモリブロックの自動解放処理で解放されたオブジェクトの割合です。巨大ブロック上で解放率が低いオブジェクトは,巨大ブロックを生成する要因となるオブジェクトであることがわかります。オブジェクト解放率情報は,eheapprofコマンドに-freeratioオプションを指定して実行すると,拡張スレッドダンプのExplicitヒープ情報に出力できます。この情報を参考にして,そのオブジェクトのクラスを明示管理ヒープ機能適用除外設定ファイルに指定します。明示管理ヒープ機能適用除外設定ファイルへの指定方法については,「7.13.3 設定ファイルを使った明示管理ヒープ機能の適用対象の制御」を参照してください。
オブジェクト解放率情報の出力例を次の図に示します。
この図に示すように,JavaVMは,オブジェクト解放率情報を求めるために,FullGCと,Explicitメモリブロックの自動解放処理を実行します。これらの処理によって,アプリケーションの実行が数秒間止まるおそれがあるため,オブジェクト解放率情報は,システム開発時や業務停止時間中に出力することをお勧めします。
また,ここで出力されるオブジェクト解放率情報は,情報出力時に発生させた自動解放処理1回の結果を基に算出したものです。このため,オブジェクト解放率情報の精度を上げるためには,複数回取得することをお勧めします。
(2) 実行される内容
eheapprofコマンドに-freeratioオプションを指定して実行すると,JavaVMによって次の処理が実行されます。
-
FullGCの発生
-
自動配置機能で生成したExplicitメモリブロック,およびeheapprofコマンド実行前に明示解放予約されたExplicitメモリブロックに対する自動解放予約
自動解放予約の対象とならなかったExplicitメモリブロックのオブジェクト解放率には,「-」が出力されます。
-
2.で自動解放予約されたExplicitメモリブロックに対する自動解放処理
JavaVMは,自動解放処理の前後でExplicitメモリブロック単位にクラスごとのオブジェクト数情報を取得して保持します。
-
3.で取得した情報から算出したオブジェクト解放率情報の拡張スレッドダンプへの出力
オブジェクト解放率情報の算出例を次の図に示します。
外部(解放対象外のExplicitメモリブロック)から参照されているオブジェクトがある場合は,自動解放処理時に新規のExplicitメモリブロックへ移動します。Explicitメモリブロック6のように,自動解放前が複数のExplicitメモリブロックのときは,複数のExplicitメモリブロックのオブジェクト数の合計値と,新規のExplicitメモリブロックのオブジェクト数からオブジェクト解放率を算出します。
なお,eheapprofコマンドの指定方法,およびExplicitヒープ情報の出力内容については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「eheapprof(Explicitヒープ詳細情報付き拡張スレッドダンプの出力)」を参照してください。