9.6.1 参照関係情報出力機能の概要
jheapprofコマンドの-classオプションに指定したクラスのインスタンスがどのクラスから参照されているかを,インスタンスの参照関係の先頭から順番に出力します。
指定したクラスのインスタンスが複数ある場合は,該当するすべてのインスタンスが出力されます。同じ名前のインスタンスが複数ある場合でも,インスタンス名のあとに次の情報が出力されるため,別のインスタンスかどうか識別できます。
-
インスタンスのアドレス
-
インスタンスが所属している領域名称
参照関係情報出力機能では,基点となるオブジェクトから次の順序に従って参照されるオブジェクトの参照関係を調べます。基点となるオブジェクトは,ほかの参照関係で調べられていないオブジェクトが該当します。1.,2.,3.は調査の優先順を示します。
-
Javaヒープ内のアドレスの低い順
-
明示管理ヒープ内のアドレスの低い順
参照先のオブジェクトが-classオプションで指定したクラスの場合,参照関係情報には,基点となるオブジェクトから-classオプションで指定したクラスのオブジェクトまでの参照関係が出力されます。参照先のオブジェクトが調査済みの場合は,分岐点まで戻って参照関係を調べます。参照先のオブジェクトがほかの参照関係の基点となるオブジェクトである場合は,参照先オブジェクトとして扱います。すべての基点となるオブジェクトがなくなるまで参照関係を調べます。
また,jheapprofコマンドで-staticrootオプションを指定すると,staticフィールドを基点とした参照関係情報出力機能が有効になります。この機能は,参照関係情報出力機能を前提としています。staticフィールドを基点とした参照関係情報出力機能では,参照関係情報出力機能が出力する参照関係情報に,staticフィールドを基点とした参照関係情報を追加して出力します。この出力情報は,staticフィールドを基点とした参照関係によるメモリリークの原因を究明するために使用します。
メモリリーク状態の参照関係の例を次に示します。
図の参照関係のインスタンス「d/Cd」にstaticフィールドを基点とした参照関係情報出力機能を実行すると,次の参照関係情報が出力されます。
この情報を基に,リーク対策として,次のフィールドの参照をクリアします。このことで,「d/Cd」はGCで回収されるため,メモリリークを解消することができます。
-
インスタンス「c/Cc」のインスタンスフィールド「id1」
-
クラス「Ca」のstaticフィールド「sd1」
参照関係情報出力機能の参照関係情報については,「9.6.2 参照関係情報出力機能で出力するクラス別統計情報」を,staticフィールドを基点とした参照関係情報については,「9.6.3 staticフィールドを基点とした参照関係情報出力機能で出力するクラス別統計情報」を参照してください。