jstackトレースの取得方法
jstack コマンドラインユーティリティは特定のプロセスやコアにアッタチして、そのJavaスレッド及びVM内部のスレッドを含むすべてのスレッドのスタック・トレースを出力することができます。
スタック・トレースの分析は主にJava プロセスに関連した問題の解決に役立つ場合があります。ここでは jstack コマンドを利用したスタック・トレースの取得方法について解説します。
ステップ1. 調査対象のプロセスのPIDを取得
– Web Admin toolにアクセスできる場合、 [Status] > [SIP Server] > [PID] フィールドを確認します。
– 障害等でWeb Admin toolに接続できない場合、OSにログイン後、以下の コマンドを実行することでPID を取得します。
Windows:
netstat -ano | findstr "5060" <- SIP SERVER のPIDを探す場合
netstat -ano | findstr "8080" <- TomcatのPIDを探す場合※1
以下の例では “2152” がSIP ServerのPIDとなります。
C:\Users\Nori>netstat -ano | findstr "5060" UDP 0.0.0.0:5060 *:* 2152 UDP [::]:5060 *:* 2152
Linux :
lsof -i:5060 <- SIP SERVER のPIDを探す場合
lsof -i:8080 <- TomcatのPIDを探す場合※1
以下の例では “1827” がSIP ServerのPIDとなります。
[root@ccspef1 bin]# lsof -i:5060 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1827 root 62r IPv6 13257 0t0 UDP *:sip java 1827 root 64r IPv6 13260 0t0 TCP *:sip (LISTEN)
※1. TomcatがWebサービス用ポートとして8080を使用している場合を想定しています。
ステップ2.jstackコマンドの実行
取得したPIDを利用してjstack コマンド※2を実行します。この際、出力結果をファイルにリダイレクトします。
以下は PID が 1872の場合の実行例です。
jstack -l 1872 > jstack.txt
実際の現場では問題が発生している期間に間隔をおいて複数回jstackの結果を取得する必要がある場合があります(「5秒おきにトータル3回実行」など)。そのような場合は以下のようにファイル名を変えてコマンドを実行してください。(出力ファイルの上書き防止のため)
jstack -l 1872 > jstack1.txt jstack -l 1872 > jstack2.txt jstack -l 1872 > jstack3.txt
※2. 通常、”jstack” コマンドは “<JDK インストールディレクトリ>/bin/”にあります。