9.8.3 Tenured領域内不要オブジェクト統計機能の実行に関する注意事項
Tenured領域内不要オブジェクト統計機能の注意事項を次に示します。
- 〈この項の構成〉
(1) Tenured領域内不要オブジェクト統計機能をFullGC直後に実行した場合の注意事項
Tenured領域内不要オブジェクト統計機能をFullGC直後に実行すると,統計対象のTenured領域内の不要なオブジェクトが回収されている状態で統計処理を実行します。そのため,クラス別統計情報中のインスタンスサイズの合計,およびインスタンス数が小さくなり,不要なオブジェクトが効果的に特定されません。不要なオブジェクトを効果的に特定するためにはTenured領域内不要オブジェクト統計機能を実行してください。なお,Tenured領域内不要オブジェクト統計機能の実行について,FullGCの発生のタイミングが判明している場合と,判明していない場合に分けて説明します。
(a) FullGCが発生するタイミングが判明している場合
Tenured領域内不要オブジェクト統計機能をFullGCの直前に実行すると,統計対象であるTenured領域内の不要オブジェクトの数が多い状態で統計処理が実行されます。そのため,クラス別統計情報中のインスタンスサイズの合計,およびインスタンス数が大きくなり,不要なオブジェクトを効果的に特定できます。
(b) FullGCが発生するタイミングが判明していない場合
クラス別統計情報中のインスタンスサイズの合計,およびインスタンス数をできるだけ大きくし,不要なオブジェクトを効果的に特定する方法を示します。
-
FullGCの発生のタイミングを知るためにJavaVM起動時に拡張verbosegc情報を出力するオプション-XX:+HitachiVerboseGCを設定します。オプションを指定することでGCの情報を取得できます。
-
JavaVMに対してTenured領域内不要オブジェクト統計機能を一定の間隔で実行します。それによって,GCの情報と,複数のクラス別統計情報を取得できます。
-
拡張verbosegc情報からFullGCの日時を取得できるため,FullGCにより近いクラス別統計情報を選択します。FullGCに近いクラス別統計情報は,統計対象であるTenured領域内の不要なオブジェクトの数が多い状態で統計処理された情報です。
(2) 統計結果に関する注意事項
図9-12のような参照関係の場合を例に統計結果に関する注意事項を説明します。
この図で,a1が最も下位のアドレスとした場合,a1を基点となるオブジェクトとして,a1→b1→c1という参照関係で統計処理を実行します。このとき,b1またはc1を基点となるオブジェクトとしている場合,Tenured領域内不要オブジェクト統計機能,およびTenured増加要因の基点オブジェクトリスト機能の統計結果には,意図したとおりの結果が出力できません。
(3) 統計対象とならないオブジェクトに関する注意事項
図9-13のようにTenured領域のオブジェクト(a1およびc1)が,Tenured領域以外のオブジェクト(b1)と参照関係がある場合を例に,統計対象とならないオブジェクトに関する注意事項を説明します。
この図の場合,Tenured領域以外のオブジェクト(b1)は統計対象とはなりません。しかし,クラスBのインスタンスサイズの合計には,参照先のTenured領域のオブジェクト(c1)のサイズが加算されます。
(4) 複数のオブジェクトから参照関係がある場合の注意事項
図9-14のように複数の参照元(c1およびd1)から一つのオブジェクト(b1)を参照している参照関係がある場合を例に,複数のオブジェクトから参照関係がある場合の注意事項を説明します。
この図の場合,Tenured領域内不要オブジェクト統計機能を実行すると,その参照元が属している参照関係の基点となるオブジェクト(c1およびa1)のうち,アドレスが最も低位である基点となるオブジェクトから統計処理が実行されます。そのため,アドレスが最も低位のオブジェクトがa1で,基点となるオブジェクトがc1である場合,Tenured領域内不要オブジェクト統計機能,およびTenured増加要因の基点オブジェクトリスト機能の統計結果には,意図したとおりの結果が出力できません。
(5) 統計値の増加に関する注意事項
オプション-XX:+HitachiAutoExplicitMemoryを指定したJavaプロセスに対して,Tenured領域内不要オブジェクト統計機能,およびTenured増加要因の基点オブジェクトリスト出力機能を実行すると,次に示すような現象が発生する場合があります。
-
Tenured領域内不要オブジェクト統計機能で出力されるクラス別統計情報のうち,float型の配列型(クラス名に[Fと出力される情報)のインスタンスサイズの合計,およびインスタンス数の統計値が,本来の統計値よりも大きくなります。クラス別統計情報の出力例を次に示します。
Garbage Profile --------------- ________________Size__Instances__Class________________ 43861400 473859 [F 0 0 java.util.Collections$EmptyMap 0 0 sun.security.util.Debug 0 0 java.nio.ByteOrder
-
Tenured増加要因の基点オブジェクトリスト出力機能で出力されるTenured増加要因の基点オブジェクトリストに,float型の配列型(クラス名に[Fと出力される情報)が出力されることでインスタンスサイズの合計の統計値が,本来の統計値よりも大きくなります。Tenured増加要因の基点オブジェクトリストの出力例を次に示します。
Garbage Profile Root Object Information --------------------------------------- *, [F # 43861400