Cosminexus リファレンス コマンド編
jheapprof(日立クラス別統計付き拡張スレッドダンプの出力)
形式
jheapprof [-f|-i] [-class <クラス名>] -p <プロセスID>
機能
引数に指定したプロセスIDのjavaプロセスに対して,日立クラス別統計情報を含んだ拡張スレッドダンプを出力します。
引数
戻り値
入力例
% jheapprof -p 2463
| Writing Java core to javacore2463.030806215140.txt... OK |
出力例
日立クラス別統計情報には,次の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
クラス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の場合)
| 項番 | エラーメッセージ | 説明 |
|---|---|---|
| 1 | usage: jheapprof [-f|-i] [-class classname] -p process-id | jheapprofコマンドへの引数の指定が間違っています。 |
| 2 | jheapprof: illegal option -- <オプション> | jheapprofコマンドに指定した<オプション>が不正です。 |
| 3 | <プロセスID>: Now processing previous request, this request canceled | jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスが現在クラス別統計の出力中です。 |
| 4 | <プロセスID>: Not owner | jheapprofコマンドに指定した<プロセスID>に0が指定されています。 |
| 5 | jheapprof: can't create work file at temporary directory , this request canceled | 一時ファイル用ディレクトリに参照・書き込み権限がない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。 |
| 6 | jheapprof: can't get temporary directory, this request canceled | 一時ファイル用ディレクトリが取り出せない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。 |
| 7 | jheapprof: please delete <削除できなかったファイル名> in <削除できなかったファイルのフルパス> | jheapprofコマンドを終了したときに,内部ファイルを削除できませんでした。削除できなかったファイルのフルパスにある,削除できなかったファイルを削除してください。 |
| 8 | jheapprof: unexpected error occurred: <エラー原因> | jheapprofコマンド実行中に予期しないエラーが発生しました。 <エラー原因>には,例えば下記のような表示がされます。
|
| 9 | jheapprof: can't communicate with process <プロセスID> | jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスに問題がある,または通信処理でエラーが発生しているため,通信できません。 |
| 10 | <プロセスID>: Timeout occurred. Java process not responding | jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスから,一定時間内に日立クラス別統計出力処理終了の応答がなかったか,または指定した<プロセスID>がjavaプロセス以外の<プロセスID>です。 |
表7-8 jheapprofコマンドで出力されるメッセージ(UNIXの場合)
| 項番 | エラーメッセージ | 説明 |
|---|---|---|
| 1 | usage: jheapprof [-f|-i] [-class classname] -p process-id | jheapprofコマンドへの引数の指定が間違っています。 |
| 2 | jheapprof: illegal option -- <オプション> | jheapprofコマンドに指定した<オプション>が不正です。 |
| 3 | <プロセスID>: Now processing previous request, this request canceled | jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスが現在クラス別統計の出力中です。 |
| 4 | <プロセスID>: No such process | jheapprofコマンドの引数に指定した<プロセスID>のプロセスがありません。 |
| 5 | <プロセスID>: Not owner | jheapprofコマンドに指定した<プロセスID>のプロセスのオーナーではありません。 |
| 6 | jheapprof: can't create work file at /tmp , this request canceled | 一時ファイル用ディレクトリに参照・書き込み権限がない場合,日立クラス別統計付き拡張スレッドダンプを出力できません。日立クラス別統計付き拡張スレッドダンプの出力要求はキャンセルされます。 |
| 7 | jheapprof: please delete <削除できなかったファイル名> in <削除できなかったファイルのフルパス> | jheapprofコマンドを終了したときに,内部ファイルを削除できませんでした。削除できなかったファイルのフルパスにある,削除できなかったファイルを削除してください。 |
| 8 | jheapprof: unexpected error occurred: <エラー原因> | jheapprofコマンド実行中に予期しないエラーが発生しました。 <エラー原因>には,例えば下記のような表示がされます。
|
| 9 | <プロセスID>: Timeout occurred. Java process not responding | jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスから,一定時間内に日立クラス別統計出力処理終了の応答がなかったか,または指定した<プロセスID>がjavaプロセス以外の<プロセスID>です。 |
注意事項
All Rights Reserved. Copyright (C) 2006, 2008, Hitachi, Ltd.