jheapprof日立クラス別統計付き拡張スレッドダンプの出力

形式

jheapprof [-f|-i] [-class <クラス名>] -p <プロセスID>

機能

引数に指定したプロセスIDのjavaプロセスに対して,日立クラス別統計情報を含んだ拡張スレッドダンプを出力します。

引数

-f
-iオプションを無効にします。省略した場合,日立クラス別統計付き拡張スレッドダンプの出力処理の実行を確認するメッセージが表示されるので,yまたはnを入力します。このとき,yを入力すると日立クラス別統計付き拡張スレッドダンプが出力されます。nを入力すると,何もしないで処理を終了します。
-i
日立クラス別統計付き拡張スレッドダンプの出力処理の実行を確認するメッセージが表示されます。省略した場合,-fオプションが指定されないかぎり,このオプションは有効です。
-class <クラス名>
<クラス名>に指定したクラス(インスタンス)をメンバに持つクラスの構造を一覧にしてスレッドダンプ中に出力します。指定するクラスのパッケージ名は「"(ダブルクォーテーション)」で囲みます。
-p <プロセスID>
<プロセスID>には,日立クラス別統計情報を出力するjavaプログラムのプロセスIDを指定します。

戻り値

0:
正常終了しました。
1:
異常終了しました。
2:
一定時間内に日立クラス別統計出力処理終了の応答がありませんでした。

入力例

  1. -fオプションを省略してjheapprofコマンドを実行します。

    % jheapprof -p 2463

  2. Windowsの場合,日立クラス別統計付き拡張スレッドダンプを出力するかどうかの確認メッセージが表示されます。UNIXの場合,プロセスIDの確認メッセージが表示されます。
    • Windowsの場合
      Force VM to output HitachiJavaHeapProfile: ? (y/n)
    • UNIXの場合
      send SIGQUIT to 2463: ? (y/n)
  3. Windowsの場合,日立クラス別統計付き拡張スレッドダンプを出力する場合はyを,出力しない場合はnを入力します。UNIXの場合,SIGQUITシグナルを送信させる場合はyを,送信させない場合はnを入力します。
    • Windowsの場合
      Force VM to output HitachiJavaHeapProfile: ? (y/n)y
    • UNIXの場合
      send SIGQUIT to 2463: ? (y/n)y
  4. 日立クラス別統計付き拡張スレッドダンプを出力すると,実行中のjavaプログラムでは次のメッセージが出力されます。
    Writing Java core to javacore2463.030806215140.txt... OK
  5. 実行中のjavaプログラムは,カレントディレクトリに日立クラス別統計付き拡張スレッドダンプ(javacore<プロセスID>.<日時>.txt)を作成し,プログラムを継続します。

出力例

日立クラス別統計情報には,次の3種類の機能で出力した情報が存在します。

インスタンス統計機能

インスタンス統計機能では,classAのインスタンス→classAのメンバ変数(クラスはclassB)→classBのインスタンス→...とインスタンスの参照関係を調べ,ほかのインスタンスへの参照を持たないインスタンスのサイズをそのインスタンスをメンバに持つクラスに再帰的に加算します。つまり,インスタンス統計機能とは,各クラスのインスタンスがメンバとして持つインスタンスサイズの合計が出力される機能です。

次のソースを例にして説明します。

public class instance {
 public static void main(String args[]) {
   classA cls_a = new classA();
   try {
     Thread.sleep(20000);
   } catch (Exception e) {}
 }
}
class classA {
 classB a1;
 classC a2;
 classA() {
   a1 = new classB();
   a2 = new classC();
 }
}
class classB {
 classD b1;
 String b2;
 classB() {
   b1 = new classD();
   b2 = null;
 }
}
class classC {
 String c1, c2;
 classC() {
   c1 = null;
   c2 = null;
 }
}
class classD {
 String d1, d2;
 classD() {
   d1 = null;
   d2 = null;
 }
}

上記のソースの場合,次のようなインスタンス構造になっています。

[図データ]

このようなインスタンス構造の場合,インスタンス統計機能では,次のように各クラスのサイズを加算します。

したがって,出力結果は次のようになります。

[図データ]

STATICメンバ統計機能

STATICメンバ統計機能もインスタンス統計機能と同様に,インスタンスの参照関係を調べ,そのサイズを加算して統計情報を出力します。インスタンス統計機能と異なる点は,インスタンス統計機能が最初に取り出したインスタンスの非staticフィールドから参照関係を構築するのに対し,STATICメンバ統計機能は最初に取り出したインスタンスのstaticフィールド(=クラスのstaticフィールド)から参照関係を調べるという点です。これによって,各クラスのstaticメンバが持つインスタンスの合計サイズを得ることができます。ただし,最初に取り出すインスタンス以外では,インスタンス統計機能/STATICメンバ統計機能共に,インスタンスの非staticメンバを基に参照関係を調べます。

インスタンス統計機能とSTATICメンバ統計機能の違いを次のソースを例にして説明します。

public class static_instance {
 public static void main(String args[]) {
   classA cls_a;
   classB cls_b;
   classC cls_c;

   cls_a = new classA();
   cls_b = new classB();
   cls_c = new classC();
   cls_b.cls_c = cls_c;
   cls_a.cls_b = cls_b;

   try {
     Thread.sleep(20000);
   } catch (Exception e) {}
 }
}
class classA {
 static classB cls_b;
}
class classB {
 classC cls_c;
}
class classC {
}

上記のソースの場合,インスタンス統計機能とSTATICメンバ統計機能では,次のような違いがあります。

[図データ]

上の図でインスタンス統計機能の参照関係は次のようになります。

インスタンスAのインスタンス変数 cls_b → インスタンスBのインスタンス変数 cls_c → インスタンスC

一方,STATICメンバ統計機能の参照関係は次のようになります。

クラスAのクラス変数cls_b → インスタンスBのインスタンス変数cls_c → インスタンスC

STATICメンバ統計機能での出力結果を次に示します。

[図データ]

クラス構造出力機能

jheapprofコマンドに-classオプションを指定することで,指定したクラス(インスタンス)をメンバに持つクラスの構造を一覧にしてスレッドダンプ中に出力できます。

指定したクラスのインスタンスが複数ある場合は,該当するすべてのインスタンスが出力されます。同じ名前のインスタンスが複数ある場合でも,インスタンス名のあとに,そのインスタンスのアドレスが出力されるため,別のインスタンスかどうか識別できます。

次のソースを例にして説明します。

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;
}

上記のソースの場合,次のようなインスタンス構造になっています。

[図データ]

jheapprofコマンドに引数「-class <クラス名>」を指定した場合,出力結果は次のようになります。

[図データ]

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

なお,ガーベージコレクションの発生によってインスタンスのメモリ上の配置が変化します。そのため,出力するたびにアドレスが変化する場合があります。

出力メッセージ

次のエラーメッセージまたは警告メッセージが出力された場合,日立クラス別統計付き拡張スレッドダンプは出力されません。

表7-7 jheapprofコマンドで出力されるメッセージ(Windowsの場合)

項番エラーメッセージ説明
1usage: jheapprof [-f|-i] [-class classname] -p process-idjheapprofコマンドへの引数の指定が間違っています。
2jheapprof: illegal option -- <オプション>jheapprofコマンドに指定した<オプション>が不正です。
3<プロセスID>: Now processing previous request, this request canceledjheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスが現在クラス別統計の出力中です。
4<プロセスID>: Not ownerjheapprofコマンドに指定した<プロセスID>に0が指定されています。
5jheapprof: can't create work file at temporary directory , this request canceled一時ファイル用ディレクトリに参照・書き込み権限がない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。
6jheapprof: can't get temporary directory, this request canceled一時ファイル用ディレクトリが取り出せない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。
7jheapprof: please delete <削除できなかったファイル名> in <削除できなかったファイルのフルパス>jheapprofコマンドを終了したときに,内部ファイルを削除できませんでした。削除できなかったファイルのフルパスにある,削除できなかったファイルを削除してください。
8jheapprof: unexpected error occurred: <エラー原因>jheapprofコマンド実行中に予期しないエラーが発生しました。
<エラー原因>には,例えば下記のような表示がされます。
  • 作業用メモリ確保に失敗した場合
    malloc systemcall fail (errno=Y)
  • オブジェクトのクローズに失敗した場合
    close systemcall fail (errno=Y)
9jheapprof: can't communicate with process <プロセスID>jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスに問題がある,または通信処理でエラーが発生しているため,通信できません。
10<プロセスID>: Timeout occurred. Java process not respondingjheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスから,一定時間内に日立クラス別統計出力処理終了の応答がなかったか,または指定した<プロセスID>がjavaプロセス以外の<プロセスID>です。

表7-8 jheapprofコマンドで出力されるメッセージ(UNIXの場合)

項番エラーメッセージ説明
1usage: jheapprof [-f|-i] [-class classname] -p process-idjheapprofコマンドへの引数の指定が間違っています。
2jheapprof: illegal option -- <オプション>jheapprofコマンドに指定した<オプション>が不正です。
3<プロセスID>: Now processing previous request, this request canceledjheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスが現在クラス別統計の出力中です。
4<プロセスID>: No such processjheapprofコマンドの引数に指定した<プロセスID>のプロセスがありません。
5<プロセスID>: Not ownerjheapprofコマンドに指定した<プロセスID>のプロセスのオーナーではありません。
6jheapprof: can't create work file at /tmp , this request canceled一時ファイル用ディレクトリに参照・書き込み権限がない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。
7jheapprof: please delete <削除できなかったファイル名> in <削除できなかったファイルのフルパス>jheapprofコマンドを終了したときに,内部ファイルを削除できませんでした。削除できなかったファイルのフルパスにある,削除できなかったファイルを削除してください。
8jheapprof: unexpected error occurred: <エラー原因>jheapprofコマンド実行中に予期しないエラーが発生しました。
<エラー原因>には,例えば下記のような表示がされます。
  • 作業用メモリ確保に失敗した場合
    malloc systemcall fail (errno=Y)
  • オブジェクトのクローズに失敗した場合
    close systemcall fail (errno=Y)
9<プロセスID>: Timeout occurred. Java process not respondingjheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスから,一定時間内に日立クラス別統計出力処理終了の応答がなかったか,または指定した<プロセスID>がjavaプロセス以外の<プロセスID>です。

注意事項