4.3.1 インスタンス統計機能の概要
インスタンス統計機能は,アプリケーションのメモリリークの調査で使用します。
インスタンス統計機能では,classAのインスタンス→classAのメンバ変数(クラスはclassB)→classBのインスタンス→...とインスタンスの参照関係を調べ,ほかのインスタンスへの参照を持たないインスタンスのサイズをそのインスタンスをメンバに持つクラスに再帰的に加算します。つまり,インスタンス統計機能では,各クラスのインスタンスが参照しているインスタンスの合計サイズが出力されます。
メモリリークの原因を調査する場合は,次のように,メモリリークを調査したいアプリケーションの処理の前後でインスタンス統計機能を実行し,1.と3.のインスタンス数やインスタンスの合計サイズの差分を取り,その増加量を見てメモリリークの原因となっているクラスを特定します。
-
インスタンス統計機能を実行します。
-
メモリリークを調査したいアプリケーションの処理を実行します。
-
インスタンス統計機能を実行します。
なお,インスタンス統計機能は,各クラスのインスタンスが参照しているすべてのインスタンスのサイズを再帰的に加算するため,各クラスのインスタンスだけのサイズ(参照しているインスタンスのサイズを含まないサイズ)を調べることはできません。
統計対象ごとの出力結果について,次の図に示すインスタンス構造を例に説明します。
インスタンスa1,b1,b2,およびc1がクラス別統計情報の対象となります。
統計対象ごとのインスタンス数とインスタンスの合計サイズを次の表に示します。
統計対象 |
クラスA |
クラスB |
クラスC |
|||
---|---|---|---|---|---|---|
インスタンス数 |
合計サイズ※ |
インスタンス数 |
合計サイズ※ |
インスタンス数※ |
合計サイズ※ |
|
Javaヒープ |
1 |
121 |
2 |
21 |
1 |
1 |
各クラスのインスタンスの合計サイズの算出式を次に示します。
-
クラスAの場合:a1+b1+b2+c1
-
クラスBの場合:b1+b2+c1
-
クラスCの場合:c1
インスタンス統計機能では,基点となるオブジェクトから次の順序に従って参照されるオブジェクトの参照関係を調べます。基点となるオブジェクトは,ほかの参照関係で調べられていないオブジェクトが該当します。1.,2.は調査の優先順を示します。
-
Javaヒープ内のアドレスの低い順
-
Metaspace領域内のアドレスの低い順
参照先のオブジェクトが調査済みの場合は,分岐点まで戻って参照関係を調べます。
また,参照先のオブジェクトがほかの参照関係の基点となるオブジェクトである場合は,参照先オブジェクトとして扱います。すべての基点となるオブジェクトがなくなるまで参照関係を調べます。
インスタンス統計機能の場合,インスタンス数には各クラスのインスタンス数が出力されます。インスタンスの合計サイズには,次の内容が出力されます。
-
基点となるオブジェクトのサイズは,該当するクラスに加算されます。参照先のオブジェクトのサイズは,該当するクラスに加算され,さらに基点となるオブジェクト,および該当するクラスまでの参照関係にあるすべてのオブジェクトの該当するクラスにも加算されます。