ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework システム構築・運用ガイド

[目次][索引][前へ][次へ]

6.3.5 スレッドダンプの詳細

スレッドダンプとは,Javaのプロセス内で動作しているスレッドの情報が出力されるファイルです。

ここでは,スレッドダンプの採取手順およびjheapprofコマンドについて説明します。

<この項の構成>
(1) スレッドダンプの採取手順
(2) jheapprof(日立クラス別統計情報付き拡張スレッドダンプの出力)の詳細

(1) スレッドダンプの採取手順

次に示す手順に従って採取してください。

  1. 次のコマンドを実行し,運用ディレクトリで起動しているサーバプロセスを特定します。
    <インストールディレクトリ>\psb\jdk\bin\jps -v
    表示結果の例を次に示します。SDPManagerおよび運用ディレクトリが表示されている行が,SDPサーバを示します。この例では,SDPサーバのプロセスIDは「4616」となります。
    3980 Program -Xms40m -Xmx256m
    5216 Jps -Dapplication.home=<インストールディレクトリ>\psb\jdk -Xms8m
    4616 SDPManager -Dsdp.home=<運用ディレクトリ> -Dsdp.serverLogging
  2. 手順1.で表示されたSDPサーバのプロセスIDに対して次のコマンドを実行し,スレッドダンプを採取します。
    <インストールディレクトリ>\psb\jdk\jre\bin\jheapprof -f -p 4616
    コマンドを実行すると,運用ディレクトリ下に,「javacore<プロセスID>.<日時>.txt」というファイル名のスレッドダンプファイルが生成されます。

スレッドダンプは,3秒おきに10回程度取得することを推奨しています。複数回スレッドダンプを取得することによって,スローダウンや無応答がどのメソッドの処理で起こっているかを,時系列順に調査できます。

スレッドダンプを取得する際は,前回のスレッドダンプの出力が終了してから取得してください。

(2) jheapprof(日立クラス別統計情報付き拡張スレッドダンプの出力)の詳細

jheapprofコマンドの形式や機能,使用例などについて説明します。

形式
jheapprof [-i|-f] [-class <クラス名>] [-explicit|-noexplicit] [-fullgc|-copygc|-nogc] -p <プロセスID>
機能
Javaプロセスについて,日立クラス別統計情報を含んだ拡張スレッドダンプを出力します。日立クラス別統計情報によって,各クラスのインスタンスが持つメンバの配下にあるすべてのインスタンスのサイズが取得できます。
実行権限
なし
コマンド実行の前提条件
なし
格納先ディレクトリ
<インストールディレクトリ>\psb\jdk\jre\bin\
引数
-i
指定されたプロセスIDのプロセスに対して,このコマンドを実行してもよいかどうかをユーザーに確認します。
この指定を省略しても,-fオプションが指定されないかぎり,このオプションが有効になります。
-f
指定されたプロセスIDのプロセスに対して,このコマンドを実行してもよいかどうかをユーザーに確認しません。
-class <クラス名>
<クラス名>に指定されたクラス(インスタンス)をメンバに持つクラスの構造を一覧にしてスレッドダンプ中に出力します。指定するクラスのパッケージ名は引用符(")で囲みます。
-explicit
インスタンス統計機能の統計対象にExplicitヒープを含めます。このオプションと-noexplicitオプションを同時に指定している場合,最後に指定しているオプションが有効になります。なお,SDPサーバではこのオプションを指定する必要はありません。
-noexplicit
インスタンス統計機能の統計対象にExplicitヒープを含めません。このオプションと-explicitオプションを同時に指定している場合,最後に指定しているオプションが有効になります。なお,SDPサーバではこのオプションを指定する必要はありません。
-fullgc
統計情報を出力する前に,フルガーベージコレクションを実行します。
このオプションと-copygcオプションまたは-nogcオプションを同時に指定している場合,最後に指定しているオプションが有効になります。
-copygc
統計情報を出力する前に,コピーガーベージコレクションを実行します。
このオプションと-fullgcオプションまたは-nogcオプションを同時に指定している場合,最後に指定しているオプションが有効になります。
-nogc
統計情報を出力する前に,ガーベージコレクションを実行しません。
このオプションと-fullgcオプションまたは-copygcオプションを同時に指定している場合,最後に指定しているオプションが有効になります。
-p <プロセスID>
日立クラス別統計情報を出力するJavaプログラムのプロセスIDを指定します。
注意事項
  • 同じJavaプロセスに対して,2回以上このコマンドを実行できません。同じJavaプロセスに対して2回以上このコマンドを実行したい場合は,先に実行したjheapprofコマンドによってクラス別統計情報が拡張スレッドダンプに出力されたあとに実行してください。
  • Javaプロセスは起動時にMailSlotを使った通信の初期化処理を実行します。初期化に失敗した場合,メッセージを出力して処理を中断します。
  • 引数に指定したプロセスIDのJavaプロセス所有者以外でもこのコマンドを実行できます。
戻り値
jheapprofコマンドの戻り値を次に示します。
意味
0 コマンドが正常に終了しました。
1 コマンドでエラーが発生しました。
2 一定時間内に日立クラス別統計情報出力処理終了の応答がありませんでした。
エラーメッセージ
次のメッセージが出力された場合,日立クラス別統計情報付き拡張スレッドダンプは出力されません。
エラーメッセージ 説明
usage: jheapprof [-f|-i] [-class classname] [-explicit|-noexplicit] [-fullgc|-copygc|-nogc] [-garbage|-nogarbage] [-rootobjectinfo|-norootobjectinfo] [-rootobjectinfost size] -p process-id jheapprof コマンドへの引数の指定が間違っています。
jheapprof: illegal option -- <オプション> jheapprofコマンドに指定した<オプション>が不正です。
<プロセスID>: Now processing previous request, this request canceled jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスが,クラス別統計情報の出力中です。
0: Not owner jheapprofコマンドの引数に指定した<プロセスID>に0が指定されています。
jheapprof: can't create work file at temporary directory , this request canceled 一時ファイル用ディレクトリに参照・書き込み権限がない場合,日立クラス別統計情報付き拡張スレッドダンプを出力できません。日立クラス別統計情報付き拡張スレッドダンプの出力要求はキャンセルされます。
jheapprof: can't get temporary directory, this request canceled 一時ファイル用ディレクトリが取り出せない場合,日立クラス別統計情報付き拡張スレッドダンプを出力できません。日立クラス別統計情報付き拡張スレッドダンプの出力要求はキャンセルされます。
jheapprof: please delete <削除できなかったファイル名> in <削除できなかったファイルのフルパス> jheapprofコマンドを終了したときに,内部ファイルを削除できませんでした。削除できなかったファイルのフルパスにある,削除できなかったファイルを削除してください。
jheapprof: unexpected error occurred: <エラー原因> jheapprofコマンド実行中に予期しないエラーが発生しました。
<エラー原因>には,例えば次のような表示がされます。
  • 作業用メモリ確保に失敗した場合
    malloc systemcall fail (errno=Y)
  • オブジェクトのクローズに失敗した場合
    close systemcall fail (errno=Y)
jheapprof: can't communicate with process <プロセスID> jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスに問題があり,通信処理でエラーが発生しているため通信できません。または,jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスがありません。
<プロセスID>: Timeout occurred. Java process not responding jheapprofコマンドの引数に指定した<プロセスID>に該当するプロセスから,一定時間内に日立クラス別統計出力処理終了の応答がありませんでした。
使用例
プロセスIDが8662であるJavaプログラムの,日立クラス別統計情報付き拡張スレッドダンプを取得する場合のコマンド実行例を次に示します。
jheapprof -p 8662
このコマンドを実行すると,次のように,日立クラス別統計情報付き拡張スレッドダンプを出力してもよいかどうか,確認するメッセージが出力されます。
Force VM to output HitachiJavaHeapProfile: ? (y/n)
日立クラス別統計情報付き拡張スレッドダンプを出力する場合は,Yまたはyを入力します。Yまたはy以外の文字を入力すると,日立クラス別統計情報付き拡張スレッドダンプを出力しないでコマンドを終了します。
Force VM to output HitachiJavaHeapProfile: ? (y/n)y
日立クラス別統計情報付き拡張スレッドダンプを出力すると,実行中のJavaプログラムでは次のメッセージが出力されます。
Writing Java core to javacore8662.030806215140.txt... OK
また,実行中のJavaプログラムのカレントディレクトリに,次のファイル名で拡張スレッドダンプが出力され,Javaプログラムの実行が継続されます。
javacore<プロセスID>.<日時>.txt