9.6.2 参照関係情報出力機能で出力するクラス別統計情報

ここでは,参照関係情報出力機能で出力するクラス別統計情報の出力形式,出力項目および出力例について説明します。

<この項の構成>
(1) 出力形式と出力項目
(2) 出力例

(1) 出力形式と出力項目

参照関係情報出力機能で出力するクラス別統計情報の出力形式を次に示します。

●出力形式

Reference of class <オプション指定クラス名>
--------------------------------------------
<クラス名>(<アドレス>)[<領域名称>]
 <クラス名>(<アドレス>)[<領域名称>]
   <オプション指定クラス名>(<アドレス>)[<領域名称>]
------
<クラス名>(<アドレス>)[<領域名称>]
 java.lang.ref.Finalizer<<繰り返し数> times>
   <クラス名>(<アドレス>)[<領域名称>]
     <クラス名>(<アドレス>)[<領域名称>]
       <オプション指定クラス名>(<アドレス>)[<領域名称>]
------
...

注※ <オプション指定クラス名>の文字数に19を加算した数の「-(ハイフン)」が出力されます。


●出力項目

出力形式で示した各項目について説明します。

表9-10 出力項目(参照関係情報出力機能)

出力項目意味
<クラス名>jheapprofコマンドの-classオプションに指定したクラスのインスタンスが参照するクラスの名称が出力されます。
<アドレス>インスタンスのアドレスが出力されます。
<領域名称>インスタンスが所属する領域が出力されます。
  • Eden:Eden領域を示します。
  • Survivor:Survivor領域を示します。
  • Tenured:Tenured領域を示します。
  • EM(eid=<id>):Explicitメモリブロックを示します。
<オプション指定クラス名>jheapprofコマンドの-classオプションに指定したクラス名が出力されます。
java.lang.ref.Finalizerfinalize()メソッドを持つクラスで生成するjava.lang.ref.Finalizerのオブジェクトを一つにまとめて出力することを示します。
<繰り返し数>Finalizerインスタンスの参照が連続した回数が出力されます。

(2) 出力例

参照関係情報出力機能で出力するクラス別統計情報の出力例を,次のソースを例にして説明します。

public class instance2 {
 public static void main(String args[]) {
   classA cls_a1 = new classA();    classA cls_a2 = new classA();
   classB cls_b1 = new classB();    classB cls_b2 = new classB();
   classC cls_c1 = new classC();    classC cls_c2 = new classC();
   classC cls_c3 = new classC();    classC cls_c4 = new classC();
   cls_a1.cls_a = cls_a2;    cls_a1.cls_b = cls_b1;
   cls_a1.cls_c = cls_c1;    cls_a2.cls_b = cls_b2;
   cls_b1.cls_c = cls_c2;    cls_b2.cls_c = cls_c3;
   cls_c1.cls_c = cls_c4;
   try {
     Thread.sleep(20000);
   } catch (Exception e) {}
 }
}
class classA {
 classA cls_a;
 classB cls_b;
 classC cls_c;

 classA() {
   classB cls_b;
 }
}
class classB {
 classC cls_c;
}
class classC {
 classC cls_c;
}

インスタンス構造を次の図に示します。

図9-6 インスタンス構造(参照関係情報出力機能)

[図データ]

参照関係情報出力機能の出力結果を次の図に示します。この場合,jheapprofコマンドに引数「-class <クラス名>」を指定して実行します。

図9-7 出力結果(参照関係情報出力機能)

[図データ]

classAのアドレスは,すべて同じアドレス(0x10766840)になっています。したがって,classAはすべて同じインスタンスであることがわかります。一方,(1)と(4)のclassBは,アドレスが異なっているので,別のインスタンスであることがわかります。

なお,GCの発生によってインスタンスのメモリ上の配置が変化します。そのため,アドレスおよび領域名称は,出力するたびに変化する場合があります。