7.13.2 Tenured領域利用済みサイズの増加原因が不明な場合
Survivor領域のチューニングを実施しても,Tenured領域利用済みサイズが増加し,それによるFullGCの発生間隔がシステムの要件を満たせない場合,Tenured領域利用済みサイズの増加原因となるオブジェクトをExplicitヒープへ生成します。Explicitヒープへオブジェクトを生成するには,明示管理ヒープの自動配置設定ファイルを設定します。
Tenured領域利用済みサイズの増加原因となるオブジェクトを調査する方法,および自動配置設定ファイルの設定方法について説明します。
(1) Tenured領域利用済みサイズ増加の調査
実行中のアプリケーションに対して,jheapprofコマンドに-garbageオプションを指定し,Tenured領域内不要オブジェクト統計機能を実行します。
Tenured領域内不要オブジェクト統計機能の出力例を次に示します。これによって,Tenured領域利用済みサイズ増加の原因となっているオブジェクト(Tenured増加要因の基点オブジェクト)のクラス名のリストがスレッドダンプログファイルに出力されます。
Garbage Profile Root Object Information ----------------------------------- *, java.util.HashMap # 35234568 *, java.util.WeakHashMap # 4321000
この出力例では,Tenured領域利用済みサイズの増加原因として,java.util.HashMapのオブジェクトが35,234,568バイト,またjava.util.WeakHashMapのオブジェクトが4,321,000バイトであることがわかります。Tenured領域内不要オブジェクト統計機能の詳細については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.8 Tenured領域内不要オブジェクト統計機能」を参照してください。
(2) 自動配置設定ファイルへの記載
Tenured領域内不要オブジェクト統計機能の出力例のリスト部分(後半2行)を,自動配置設定ファイルへ入力します。自動配置設定ファイルの設定例を示します。
*, java.util.HashMap # 35234568 *, java.util.WeakHashMap # 4321000
この場合,プログラム中のすべてのjava.util.HashMapオブジェクト,およびjava.util.WeakHashMapオブジェクトはExplicitヒープに生成されます。
また,これらのオブジェクトに格納したオブジェクトも順次Explicitヒープに移動します。しかし,Explicitヒープへのオブジェクトの生成は,Javaヒープへのオブジェクトの生成よりも実行時にオーバーヘッドが掛かります。このため,オブジェクトの生成個所を絞り込むことで,実行時のオーバーヘッドを削減できます。
自動配置設定ファイルでは,「*」は「JavaVM上で動作するすべてのクラス」を意味します。この設定例の場合,すべてのクラスでのjava.util.HashMapおよびjava.util.WeakHashMapのオブジェクトの生成先がExplicitヒープになります。これによって,実際にはTenured利用済みサイズ増加の原因ではないオブジェクトの生成先もExplicitヒープとなり,オーバーヘッドが増加するおそれがあります。
「*」を指定したことによって,アプリケーションのスループットが要件を満たせなくなった場合は,Tenured領域利用済みサイズ増加の原因となっているオブジェクトの生成個所を絞り込むことを検討してください。
システム運用者とアプリケーション開発者が異なる場合は,アプリケーション開発者への調査の依頼が必要です。アプリケーションの詳細な調査が困難な場合でも,自動配置設定ファイルでは生成個所を「すべてのクラス」,「特定のパッケージ」,「特定のクラス」,および「特定のメソッド」の4段階の粒度でオブジェクトの生成個所を指定できます。そのため,調査可能な範囲で絞り込みを実施して,自動配置設定ファイルを指定することによって,スループットが向上する場合もあります。
例えば,生成個所が「com.abc.defg」パッケージ下の場合,自動配置設定ファイルの設定例を次のように変更することによって,「すべてのパッケージのすべてのクラス」から,「com.abc.defgパッケージおよびサブパッケージのすべてのクラス」まで絞り込みができます。
com.abc.defg.*, java.util.HashMap # 35234568 com.abc.defg.*, java.util.WeakHashMap # 4321000
自動配置設定ファイルの指定方法の詳細については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.13.2 自動配置設定ファイルを使った明示管理ヒープ機能の使用」を参照してください。
(3) Tenured領域内不要オブジェクト統計機能によるアプリケーションの調査
自動配置設定ファイルの内容を基に,アプリケーションを調査する場合に,Tenured領域内不要オブジェクト統計機能を利用します。
jheapprofコマンドに-garbageオプションを指定し,Tenured領域内不要オブジェクト統計機能を実行することで,Tenured増加要因の基点オブジェクトリスト,およびTenured領域内不要オブジェクトの統計情報を拡張スレッドダンプに出力します。拡張スレッドダンプの出力例を次に示します。
Garbage Profile --------------- ________________Size__Instances__Class________________ 35234568 10648 java.util.HashMap 5678900 10668 [Ljava.util.HashMap$Entry; 4456788 7436 java.util.HashMap$Entry 4321000 200 java.util.WeakHashMap 1234568 190 [Ljava.util.WeakHashMap$Entry 1456788 9524 java.lang.String 1256788 6424 com.abc.defg.MyData; :
Tenured領域内不要オブジェクト統計機能では,Tenured増加要因の基点オブジェクトリストには出力されない,java.util.HashMapやjava.util.WeakHashMapに格納されているオブジェクトも出力されます。また,各オブジェクトのインスタンス数も出力されます。
さらに,このログを複数回取得して,クラス別統計情報解析機能(jheapprofanalyzerコマンド)の入力ファイルとすることで,各オブジェクトサイズ,およびインスタンス数の時間の変化を調査できます。
これらの情報を基に,アプリケーションを調査してオブジェクト生成個所の絞り込みをします。Tenured領域内不要オブジェクト統計機能の詳細については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.8 Tenured領域内不要オブジェクト統計機能」を参照してください。クラス別統計情報解析機能の詳細については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.10 クラス別統計情報解析機能」を参照してください。