9.8.1 Tenured領域内不要オブジェクト統計機能の概要
Tenured領域内不要オブジェクト統計機能では,Tenured領域内に蓄積された不要となったオブジェクトだけを特定して,スレッドダンプファイルに出力します。Tenured領域内不要オブジェクト統計機能の仕組みについて説明します。
(1) 不要なオブジェクトのサイズの出力
CopyGCの繰り返しによって,長寿命オブジェクトがTenured領域に蓄積します。蓄積した長寿命オブジェクトのうち,時間が経過して用途を失ったオブジェクトは,不要なオブジェクトとなってTenured領域内に残ります。その後,メモリがいっぱいになったタイミングでFullGCが発生します。CopyGCの発生からFullGCの発生までのTenured領域の使用量は,Tenured領域内不要オブジェクト統計機能,およびインスタンス統計機能で確認できます。
Tenured領域内不要オブジェクト統計機能,およびインスタンス統計機能を使って特定できる内容を次の図に示します。
統計前GCを実施しないでインスタンス統計機能を実行した場合,図9-10の3.のサイズが出力されます。このサイズは,図9-10の1.に該当するTenured領域内で不要となったオブジェクトのサイズ,および図9-10の2.に該当するTenured領域内で使用中のオブジェクトを含んだTenured領域内のメモリ使用状況になります。
一方,Tenured領域内不要オブジェクト統計機能を実行した場合は,図9-10の2.の使用中のオブジェクトを除いたTenured領域内のメモリ使用状況(図9-10の1.に該当)を出力できます。Tenured領域内不要オブジェクト統計機能を使うことで,Tenured領域の増加要因となる不要となったオブジェクトを特定できるため,FullGCを抑止できます。
(2) 不要なオブジェクトの参照関係の確認
Tenured領域内不要オブジェクト統計機能では,基点となるオブジェクトはTenured領域内のアドレスの低い順に検索されます。検索されたオブジェクトの中でも,ほかの参照関係で調べられていないオブジェクトが基点となるオブジェクトになります。
参照先のオブジェクトが調査済みの場合は,分岐点まで戻って参照関係を調べます。また,参照先のオブジェクトがほかの参照関係の基点となるオブジェクトである場合は,参照先オブジェクトとして扱います。すべての基点となるオブジェクトがなくなるまで参照関係を調べます。
Tenured領域内不要オブジェクト統計機能の場合,インスタンス数,およびインスタンスサイズの合計が出力されます。インスタンス数は該当するクラスを加算します。インスタンスの合計サイズには次の内容が出力されます。
-
基点となるオブジェクトのサイズは,該当するクラスに加算されます。参照先のオブジェクトのサイズは,該当するクラスに加算され,さらに基点となるオブジェクト,および該当するクラスまでの参照関係にあるすべてのオブジェクトの該当するクラスにも加算されます。
なお,Tenured領域内不要オブジェクト統計機能を実行した場合,インスタンス統計機能,STATICメンバ統計機能,および統計前のGC選択機能は無効となります。
Tenured領域内の不要オブジェクトによる参照関係の例を示します。
図9-11の参照関係について説明します。
- インスタンス数
-
-
classA:a1が存在するため1
-
classB:b1,b2の二つが存在するため2
-
classC:c1,c2の二つが存在するため2
-
- インスタンスサイズの合計
-
-
classA:classAのインスタンス(a1)と,その参照先のインスタンス(b1,b2,c1,c2)のサイズを合計した122
-
classB:classBのインスタンス(b1,b2)と,その参照先のインスタンス(c1,c2)のサイズを合計した22
-
classC:classCのインスタンス(c1,c2)を合計した2
-
Tenured領域内不要オブジェクト統計機能を実行して,図9-11の参照関係の情報を出力した場合の出力例を次に示します。
Garbage Profile --------------- ________________Size__Instances__Class________________ 122 1 A 22 2 B 2 2 C