4.2.3 javacore
スレッドダンプの取得
書式
javacore [-i|-f] -p プロセスID
格納先
Application Serverインストールディレクトリー\jdk\jre\bin\
機能
コマンド実行時のスレッドダンプを取得します。
実行権限
引数のプロセスIDで指定するjavaプロセスと同一のユーザーで実行してください。
環境変数
ファイルの出力先を変更する場合、JAVACOREDIRに出力先を指定します。
引数
- -i
-
スレッドダンプの出力処理の実行を確認するメッセージが表示されます。表示されたメッセージに対してyまたはnを入力します。このとき、yを入力するとスレッドダンプが出力されます。nを入力すると、何も出力しないで処理を終了します。省略した場合、-fオプションが指定されないかぎり、このオプションは有効です。
- -f
-
-iオプションを無効にします。省略した場合、-iオプションが有効になります。
- -p プロセスID
-
プロセスIDには、スレッドダンプを取得するjavaプログラムのプロセスIDを指定します。
型:Integer
指定できる値を次に示します。
-
0〜4294967295
-
出力形式
- ヘッダー
-
EEE MMM dd hh:mm:ss yyyy※ Full thread dump Java HotSpot(TM) Client VM (1.5.0_05-b05-CDK0850-ビルド日 mixed mode) 起動コマンドライン …
- 注※
-
EEEは曜日、MMMは月、ddは日を表します。また、hhは時間、mmは分、ssは秒、yyyyは年(西暦)を表します。
- システム設定
-
System Properties ----------------- Java Home Dir : JDK実行環境インストールディレクトリー Java DLL Dir : JDKを構成するライブラリーのインストールディレクトリー Sys Classpath : システムクラスパス User Args : Javaコマンドオプション1 Javaコマンドオプション2 …
- 動作環境
-
Operating Environment --------------------- Host : ホスト名:IPアドレス OS : OSバージョン CPU : CPU種別, 利用可能CPU数/システム全体のCPU数
- メモリー情報
-
Memory Status ------------- Memory in use : メモリー使用状況(単位:パーセント) Physical memory : 物理メモリー使用量※ free Virtual memory : 仮想メモリー使用量※ free Paging file : ページング使用量※ free
- 注※
-
利用可能サイズ/総サイズ の形式で表示されます(単位:バイト)。
- Javaヒープ情報
-
SerialGCの場合
Heap Status ----------- def new generation max max size, total capacity, used size (max usage% used/max, total usage% used/total) [bottom, commit addr, reserve addr) eden space capacity, usage% used [bottom, top, reserve addr) from space capacity, usage% used [bottom, top, reserve addr) to space capacity, usage% used [bottom, top, reserve addr) tenured generation max max size, total capacity, used size (max usage% used/max, total usage% used/total) [bottom, commit addr, reserve addr) the space capacity, usage% used [bottom, top, used block, reserve addr) Metaspace max max size, capacity capacity words, committed committed size, reserved reserve size, used size (max usage% used/max, total usage% used/committed) class space max max size, capacity capacity words, committed committed size, reserved reserve size, used size (max usage% used/max, total usage% used/committed) [bottom, top, commit addr, reserve addr)
- max size
-
最大の容量。単位はキロバイト。
Metaspaceの場合、-XX:MaxMetaspaceSizeが未指定のとき最大値は無制限のため、"unlimited"が出力されます。
- capacity
-
現在の容量。単位はキロバイト。
- capacity words
-
Metaspaceのコミット済みのメモリー領域からフリー領域を除いた合計サイズ。単位はキロバイト。
- committed size
-
Metaspaceのコミット済みの合計メモリーサイズ。単位はキロバイト。
- reserve size
-
予約済みのメモリーサイズ。単位はキロバイト。
- size
-
使用中のメモリーサイズ。単位はキロバイト。
- max usage
-
最大の容量に対する使用率。
Metaspaceの場合、-XX:MaxMetaspaceSizeが未指定のとき最大値は無制限のため、"-%"が出力されます。
- total usage
-
現在の容量に対する使用率。
- bottom
-
領域先頭アドレス。
- top
-
使用中領域の先頭アドレス。
- commit addr
-
コミット済み領域の末尾アドレス。
- reserve addr
-
予約済み領域の末尾アドレス。
- usage
-
使用率。
- used block
-
次の空きブロックの先頭アドレス。
- 注
-
class spaceは、64bit版のJava VMで圧縮オブジェクトポインター機能が有効であり、かつCompressed Class Spaceを使用している場合にだけ出力されます。
Metaspaceの値は、class spaceを含んだMetaspace全体の合計値です。
G1GCの場合
Heap Status ----------- garbage-first heap total heap capacity, used heap size [heap bottom, heap commit addr, heap reserve addr) region size region size, young region young (young size), survivor region survivors (survivor size) Metaspace max max size, capacity capacity words, committed committed size, reserved reserve size, used size (max usage% used/max, total usage% used/committed) class space max max size, capacity capacity words, committed committed size, reserved reserve size, used size (max usage% used/max, total usage% used/committed) [bottom, top, commit addr, reserve addr)
出力項目の詳細フォーマット
出力項目
出力内容
意味
heap capacity
<const>K
Javaヒープ領域の領域サイズ。単位はキロバイト。
(a)の合計サイズ+(b)の合計サイズ+(c)の合計サイズ+(d)の合計サイズ
heap size
<const>K
Javaヒープ領域の使用サイズ。単位はキロバイト。
(a)の合計サイズ+(b)の合計サイズ+(c)の合計サイズ
heap bottom
<ptr64>
Javaヒープ領域の先頭アドレス。
heap commit addr
<ptr64>
Javaヒープ領域のコミット済みの末尾アドレス。
heap reserve addr
<ptr64>
Javaヒープ領域の予約済みの末尾アドレス。
region size
<const>K
1リージョンのサイズ。単位はキロバイト。
young region
<const>
New領域の使用中のリージョン数。
(a)のリージョン数+(b)のリージョン数
young size
<const>K
New領域の使用サイズ。単位はキロバイト。
((a)のリージョン数+(b)のリージョン数)*region_size
survivor region
<const>
Survivor領域の使用中のリージョン数。
(b)のリージョン数
survivor size
<const>K
Survivor領域の使用サイズ。単位はキロバイト。
(b)のリージョン数*region_size
Metaspace、class spaceの出力項目はSerial GCの場合と同じです。「Serial GCの場合」の説明を参照してください。
- (凡例)
-
(a):Eden領域
(b):Survivor領域
(c):Tenured領域
(d):Free領域
- Java VM内部メモリーマップ情報
-
JVM Internal Memory Map ----------------------- メモリー確保関数:address = 開始アドレス - 終了アドレス (size:サイズ)
- 注
-
メモリー確保関数:mmap()かmalloc()のどちらかが出力されます。
開始アドレス:メモリー領域の開始アドレスが16進で出力されます。
終了アドレス:メモリー領域の終了アドレスが16進で出力されます。
サイズ:確保しているメモリー領域のサイズが出力されます(単位:バイト)。
- Java VM内部メモリーサイズ情報
-
JVM Internal Memory Status -------------------------- Heap Size :確保しているメモリーサイズ※ Alloc Size :使用中のメモリーサイズ※ Free Size :未使用のメモリーサイズ※
- 注※
-
単位:バイト
- アプリケーション情報
-
Application Environment ----------------------- Signal Handlers - SIGINT :シグナルハンドラー情報 SIGILL :シグナルハンドラー情報 … SIGBREAK :シグナルハンドラー情報 SIGABRT :シグナルハンドラー情報 Environment Variables - 環境変数=値 … Current Directory - C:\Program Files\Hitachi\...
- ライブラリー情報
-
Loaded Libraries ---------------- Dynamic libraries : 開始アドレス-終了アドレス コマンド 開始アドレス-終了アドレス ライブラリー …
- スレッド情報
-
----------- "スレッド名" daemon prio=優先度 jid=ハッシュ値 tid=スレッドID nid=nativeID status [開始アドレス...終了アドレス] java.lang.Thread.State: スレッドの現在のステータス※ stack=[スタック開始アドレス..YellowPageアドレス..RedPageアドレス.. スタック終了アドレス] [user cpu time=ユーザー時間ms, kernel cpu time=カーネル時間ms] [blocked count=ブロック回数, waited count=待機回数] at クラス名.メソッド名(メソッド情報) …
注※
スレッドの現在のステータスの情報は、JDK 6がベースの場合で、バージョンが08-10以降のときにだけ出力されます。
出力内容を説明します。
- スレッド名
-
Threadクラスのコンストラクターに指定されたスレッド名称が出力されます。
daemon:デーモンスレッドである場合に、"daemon"と出力されます。
優先度:Thread#setPriorityで設定された優先度が出力されます。
ハッシュ値:System.identityHashCode()を呼び出して得られる値と同一の値が8桁の16進数で出力されます。
スレッドID:スレッドオブジェクトのメモリー上のアドレス。
nativeID:OSレベルのスレッドID。
status:スレッドの状態。
runnable:実行中または実行可能なスレッド
in Object.wait()、waiting for monitor entryまたはwaiting on condition:モニターロック待ちのスレッド
sleeping:中断状態のスレッド
開始アドレス:Javaフレームの最高位スタックアドレスが16進数で出力されます。
終了アドレス:JavaLockのある最高位スタックアドレスが16進数で出力されます。
ユーザー時間:スレッド開始からのユーザー時間がミリ秒単位で出力されます。
カーネル時間:スレッド開始からのカーネル時間がミリ秒単位で出力されます。
ブロック回数:スレッド開始から、処理がブロックされた回数が出力されます。
待機回数:スレッド開始から、処理が待ち状態になった回数が出力されます。
- スレッドの現在のステータス
-
スレッドの現在のステータスを表すメッセージが出力されます。メッセージの内容はjava.lang.Thread.State列挙型に対応します。
- スタック開始アドレス
-
スタック開始アドレスが16進数で出力されます。
- YellowPageアドレス
-
スタックYellowガードページ先頭アドレスが16進数で出力されます。
- RedPageアドレス
-
スタックRedガードページ先頭アドレスが16進数で出力されます。
- スタック終了アドレス
-
スタック終了アドレスが16進数で出力されます。
- クラス名
-
クラス名が出力されます。
- メソッド名
-
メソッド名が出力されます。
- メソッド情報
-
次のメソッド情報が出力されます。
Native Method
ネイティブメソッドの場合に出力されます。
ファイル名:行番号
Javaメソッドで行番号付きでコンパイルされている場合に出力されます。
Unknown Source
Javaメソッドで行番号なしでコンパイルされている場合に出力されます。
- Javaモニターダンプ
-
Java monitor ------------ ロックオブジェクト@ハッシュコード オーナー情報 待機状態:待機スレッド数 待機スレッド情報
出力内容を説明します。
- ロックオブジェクト
-
ロック対象オブジェクトのクラス名が出力されます。
- ハッシュコード
-
Object.hashCodeで得られるハッシュコードが出力されます。
- オーナー情報
-
owner "スレッド名"スレッドID:オーナーがある場合に出力されます。
no owner:オーナーがない場合に出力されます。
- 待機状態
-
... waiting to enter:メソッド実行待ちの場合に出力されます。
... waiting to be notified:通知待ちの場合に出力されます。
- 待機スレッド数
-
スレッド数が出力されます。
- 待機スレッド情報
-
「"スレッド名" スレッドID」の形式で出力されます。
- JNIグローバル参照数の情報
-
JNI Information --------------- JNI global references: JNIグローバル参照数
出力内容を説明します。
- JNIグローバル参照数
-
Java VMが保持しているグローバル参照の数が出力されます。
- 注
-
JNIグローバル参照はJava VMの内部でも再利用されるため、JNIがサポートするDeleteGlobalRef関数を発行してJNIグローバル参照を削除しても、数値は減少しません。また、NewGlobalRef関数を発行してJNIグローバル参照を新規作成しても、Java VMが再利用したJNIグローバル参照を割り当てた場合は数値は増加しません。
- Explicitヒープ情報およびExplicitメモリーブロック情報
-
Explicit Heap Status -------------------- max EH_MAX, total EH_TOTAL, used EH_USED, garbage EH_GARB (EH_PER1 used/max, EH_PER2 used/total, EH_PER3 garbage/used), EM_NUMS spaces exist Explicit Memories(EM_MGR_PTR) "EM_NAME" eid=EID(EM_PTR)/EM_TYPE, total EM_TOTAL, used EM_USED, garbage EM_GARB (EM_PER1 used/total, EM_PER2 garbage/used, FL_BLOCKS blocks) EM_STAT ...
注意事項を次に示します。
-
Explicitヒープ情報とExplicitメモリーブロック情報の間には、空行が1行あります。
-
Explicitメモリーブロック情報の出力順序(どのExplicitメモリーブロックから出力するか)は未定義とします。
-
"EM_NAME"の前には、半角2文字分のスペースがあります。
-
最後の行には空行が1行あります。したがって、Explicitメモリーブロックごとの出力の間には空行が1行あります。
-
- フッター
-
Full thread dump completed. EEE MMM dd hh:mm:ss yyyy※
- 注※
-
EEEは曜日、MMMは月、ddは日を表します。また、hhは時間、mmは分、ssは秒、yyyyは年(西暦)を表します。
拡張スレッドダンプ情報との比較を、次に示します。
出力情報 |
標準スレッドダンプ |
拡張スレッドダンプ |
---|---|---|
ヘッダー |
× |
○ |
システム設定 |
× |
○ |
動作環境 |
× |
○ |
メモリー情報(Windowsの場合だけ) |
× |
○ |
Javaヒープ情報 |
× |
○ |
Java VM内部メモリーマップ情報 |
× |
○ |
Java VM内部メモリーサイズ情報 |
× |
○ |
アプリケーション環境 |
× |
○ |
ライブラリー情報 |
× |
○ |
スレッド情報 |
○ |
○※1 |
Javaモニターダンプ |
× |
○ |
フッター |
× |
○ |
スレッドダンプ出力先 |
標準出力 |
標準出力※2 Java VMログファイル |
- (凡例)
-
○:出力されます。
×:出力されません。
- 注※1
-
スタックの開始および終了のアドレス情報などが出力されます。
- 注※2
-
-XX:+HitachiThreadDumpToStdoutオプションが指定された場合に出力されます。
入力例
-
-fオプションを省略してjavacoreコマンドを実行します。
% javacore -p 8326
-
スレッドダンプの出力処理の実行を確認するメッセージが表示されます。
Output a thread dump:?(y/n)
-
スレッドダンプを出力する場合はyを、出力しない場合はnを入力します。
Output a thread dump:?(y/n)y
-
実行中のjavaプログラムは、カレントディレクトリーに次のファイルを作成し、プログラムを継続します。
-
スレッドダンプ
javacoreプロセスID.日時.txt
-
戻り値
戻り値 |
説明 |
---|---|
0 |
正常終了しました。 |
1 |
異常終了しました。 |
2 |
一定時間内にcore生成処理終了の応答がありませんでした。 |
出力メッセージ
次のエラーメッセージまたは警告メッセージを出力した場合、スレッドダンプは取得されません。
項番 |
エラーメッセージ |
説明 |
---|---|---|
1 |
usage: javacore [-f|-i] [-force] -p process-id |
コマンドの引数が不正です。 |
2 |
javacore: illegal option --オプション |
コマンドの引数に指定したオプションが不正です。 |
3 |
javacore: can't communicate with process プロセスID. |
引数に指定したプロセスIDに問題があるため、通信できません。または、引数に指定したプロセスIDに該当するプロセスが存在しません。 |
4 |
プロセスID: Not owner |
コマンドの引数に指定したプロセスIDに0が指定されています。 |
5 |
プロセスID: Now processing previous request, this request canceled |
コマンドの引数に指定したプロセスIDのプロセスがすでに処理中です。 |
6 |
javacore: can't create work file at temporary directory, this request canceled |
一時ファイル用ディレクトリーに参照および書き込み権限がありません。 |
7 |
javacore: can't get temporary directory, this request canceled |
GetTempPath()APIがエラーリターンしたため、一時ファイル用ディレクトリーが取り出せません。 |
8 |
javacore: unexpected error occurred: エラー原因 |
コマンド実行中に予期しないエラーが発生しました。 |
9 |
プロセスID: Timeout occurred. Java process not responding. |
コマンドの引数に指定したプロセスIDに該当するプロセスから、一定時間内にスレッドダンプ出力処理終了の応答がありませんでした。 |
10 |
javacore: please delete 削除できなかったファイル名 in 削除できなかったファイルの絶対パス. |
コマンド終了時にjavacoreコマンドの内部処理で作成したファイルを削除できませんでした。削除できなかったファイルの絶対パスにある、削除できなかったファイルを削除してください。 |
注意事項
-
同じJavaプロセスに対して、同時にjavacoreコマンドは実行できません。前回のjavacoreコマンドによるスレッドダンプ出力処理が終了したあとに実行してください。
-
次の場合、メッセージ「プロセスID: Timeout occurred. Java process not responding.」が出力されてjavacoreコマンドが終了することがあります。
-
メモリー使用量が1ギガバイトを超えるようなJavaプロセスに対してjavacoreコマンドを実行した場合
-
システムが高負荷の状態でjavacoreコマンドを実行した場合
メッセージが出力されても、対象となるJavaプロセスのカレントディレクトリーにcore.プロセスIDが生成され、ファイルサイズが徐々に増えている場合は処理が正常に行われています。その場合はJavaプロセスを停止させないようにしてください。
-