UNIX または Windows の JVM からスレッドダンプを取得する方法

スレッドダンプは、Java 仮想マシン(JVM)で現在アクティブなすべての Java スレッドのリストです。

JVM からのスレッドダンプを取得するには、いくつかの方法があります。1 つ以上のスレッドダンプを取得することを強くお勧めします。優れた習慣の 1 つは、一定の間隔で 10 のスレッドダンプを取得する(例えば、10 秒ごとに 1 つのスレッドダンプ)ことです。

手順 1:Java プロセスの PID を取得する

スレッドダンプを取得できるようにするために必要な最初の情報は、Java プロセスの PID です。

Java JDK には、すべての Java プロセス ID をリストする jps コマンドが用意されています。次のようにこのコマンドを実行できます。

jps -l 70660 sun.tools.jps.Jps 70305

注意:Linux および UNIX では、このコマンドを sudo -u user jps -l として実行する必要がある可能性があります(「user」は Java プロセスを実行しているユーザーのユーザー名)。

これが機能しない場合、または Java プロセスを見つけられない(パスが設定されていない、JDK がインストールされていない、または Java のバージョンが古い)場合は、次を使用します。

  • UNIX、Linux および Mac OS X:ps -el | grep java
  • Windows:Ctrl + Shift + Esc を押してタスクマネージャーを開き、Java プロセスの PID を検索する

手順 2:JVM からスレッドダンプをリクエストする

jstack

インストール済みで利用可能な場合、jstack ツールを使用することをお勧めします。このツールは、コマンドラインコンソールにスレッドダンプをプリントします。

jstack を使用してスレッドダンプを取得するには、次のコマンドを実行します。
jstack -l <pid>

コンソール出力をリダイレクトして既存のログファイルの末尾に追加するディレクティブを使用すると、連続する複数のスレッドダンプを 1 つのファイルに出力できます。
jstack -l <pid> >> threaddumps.log

注意:

  • jstack ツールは、JDK 1.5 以降で使用できます(Windows の JVM では、JDK 1.5 および JDK 1.6 の一部のバージョンでのみ使用できます)。
  • jstack は、-Xrs JVM パラメーターが有効になっている場合でも機能します。
  • JDK 1.6 からの jstack ツールを使用して、JDK 1.5 上で実行しているプロセスからスレッドダンプを取得することはできません。
  • Linux と UNIX では、Java プロセスを所有するユーザーとして次のコマンドを実行する必要があります。
    sudo -u <java-user> jstack -l <pid>
    (<java-user> は、Java プロセスを実行するユーザーの ID で置き換えます)
  • Windows で、jstack を実行して「このコマンドを処理するために十分なストレージを利用できません」というエラーが発生する場合は、Windows SYSTEM ユーザーまたは Java プロセスを所有するユーザーとして jstack を実行する必要があります。  こちらからダウンロードできる psexec を使用して、これを実行できます。SYSTEM ユーザーとして jstack を実行する場合は、次のコマンドを使用します。
    psexec -s jstack <pid>  >> threaddumps.log
    psexec をサーバーにインストールできない場合は、このコマンドを含む .bat ファイルを作成してから、別のユーザーとして Windows タスクスケジューラーを使用して実行します。
  •  64 ビットシステムの場合は、次のように「-J-d64」オプションを追加しなければならないことがあります。
    jstack -J-d64 -l <pid> >> threaddumps.log

jstack スクリプト

eclipse.org から提供されているスクリプトを次に示します。このスクリプトは jstack を使用して一連のスレッドダンプを取得します。また、top コマンドを使用してスレッドレベルの CPU 使用率も取得します。

#! /bin/bash
if [ $# -eq 0 ]; then
    echo >&2 "Usage: jstackSeries <pid> <run_user> [ <count> [ <delay> ] ]"
    echo >&2 "    Defaults: count = 10, delay = 0.5 (seconds)"
    exit 1
fi
pid=$1          # required
user=$2         # required
count=${3:-10}  # defaults to 10 times
delay=${4:-0.5} # defaults to 0.5 seconds
while [ $count -gt 0 ]
do
    sudo -u $user top -H -b -n1 -p $pid >top.$pid.$(date +%H%M%S.%N) &
    sudo -u $user jstack -l $pid >jstack.$pid.$(date +%H%M%S.%N)
    sleep $delay
    let count--
    echo -n "."
done

 

次のように実行します。
sh jstackSeries.sh [pid] [cq5serveruser] [count] [delay]

例:
sh jstackSeries.sh 1234 cq5serveruser 10 3

  • 1234 は、Java プロセスの PID です。
  • cq5serveruser は、Java プロセスを実行する Linux または UNIX ユーザーです。
  • 10 は、取得するスレッドダンプの数です。
  • 3 は、各ダンプ間の遅延です。

注:top の出力は 10 進数形式のネイティブスレッド ID、jstack の出力は 16 進数形式の NID となります。スレッド ID を 16 進数に変換することで、top の出力に表示される CPU 使用率の高いスレッドを jstack の出力と一致させることができます。

Adobe Experience Manager 向けのスレッドダンプツール

Adobe Experience Manager 製品を使用している場合は、このツールをインストールすると、シンプルな UI でスレッドダンプを生成できます。

スレッドダンプを取得する別の方法

jstack ツールを利用できない場合、次のようにしてスレッドダンプを取得できます。

注意:コマンドラインパラメーター -Xrs が有効になっている場合、一部のツールは JVM からスレッドダンプを取得できません。スレッドダンプの取得に問題がある場合は、このオプションが有効になっているかどうかを確認してください。

UNIX、Mac OS X および Linux(JDK 1.4 以前のバージョン)

UNIX、Mac OS X および Linux では、QUIT シグナルを Java プロセスに送信して、標準出力にスレッドダンプを出力させることができます。

  1. これを行うには、次のコマンドを実行します。
    kill -QUIT <pid>
    このコマンドを sudo -u user kill -QUIT <pid> として実行する必要がある可能性があります(「user」は、Java プロセスを実行しているユーザー)。
  2. crx-quickstart/server/start スクリプトを使用して CQSE を開始している場合、スレッドダンプは crx-quickstart/server/logs/startup.log に出力されます。JBoss、WebSphere、Tomcat などのサードパーティのアプリケーションサーバーを使用している場合、サーバーのドキュメントを参照して、標準出力がリダイレクトされるファイルを確認してください。
Windows:
JDK 1.X
  1. javadump.exe(下記に添付)をダウンロードします。
  2. 次の 3 つの引数を使用して JVM を開始します(正しい順序である必要があります)。
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C: mpjvmoutput.log
  3. Ctrl + Shift + Esc を押して、タスクマネージャーを開きます。
  4. Java プロセスの PID を検索します。
  5. コマンドラインから、次を実行します。
    javadump.exe [pid]
  6. 手順 2 で説明した jvmoutput.log ファイルに、スレッドダンプが表示されます。
JDK 1.6

プラグイン [0] を使用して、jconsole ツールからスレッドダンプを取得します。

次に、スレッドダンプをリクエストする方法を示します。

  1. JVM を実行している Communique に次のパラメーターを追加します。-Dcom.sun.management.jmxremote
  2. JDK 1.6 をダウンロードおよびインストールします(まだの場合)。
  3. Thread Dump Analyzer ユーティリティをダウンロードおよび抽出します。[1]
  4. JDK 1.6 の jconsole.exe を実行します。
                                jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Thread dumps」タブをクリックします。
  6. Request Thread Dump」リンクをクリックします。

注意:CQ5 または CRX(Sling を使用)を実行していて、実行中のスレッドを観察したい場合、http://<host>:<port>/system/console/threads をリクエストして、スレッドリストを取得できます。ただし、これらのスレッドダンプは、samurai や tda などのスレッドダンプ分析ツールでは機能しません。

適用対象

JVM で実行するすべてのアドビ製品

[0] http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
[1] https://github.com/irockel/tda
[2] http://docs.day.com/en/home/docutools/javadump_exe.html

ダウンロード

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー