JVM からのスレッドダンプの取得
スレッドダンプは、Java 仮想マシン(JVM)で現在アクティブなすべての Java スレッドのリストです。 この記事では、Adobe Experience Manager内の JVM からスレッドダンプを取得する方法をいくつか説明します。
説明 description
環境
Adobe Experience Manager
問題/症状
Linux、UNIX、Windows の JVM からスレッドダンプを取得する方法
スレッドダンプは、Java 仮想マシン(JVM)で現在アクティブなすべての Java スレッドのリストです。
JVM からスレッドダンプを取得する方法はいくつかあります。 スレッドダンプを 1 つ以上作成することを強くお勧めします。 定期的に 10 個のスレッドダンプを取得することをお勧めします(例えば、10 秒ごとに 1 個のスレッドダンプ)。
解決策 resolution
手順 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>
コンソールの出力リダイレクト/追加ディレクティブを使用して、連続したスレッドダンプをファイルに出力できます。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 を使用します。この PSEXEC は こちらからダウンロードできます。 SYSTEM ユーザーとして jstack を実行するには、次のようなコマンドを使用します。
psexec -s jstack <pid> >> threaddumps.log
サーバに psexec をインストールできない場合は、コマンドを含む.bat ファイルを作成し、Windows のタスク スケジューラを使用して(別のユーザとして)実行ます。
-
Java プロセスが応答しない場合は、オプション -J-d64 (64 ビットシステム上)を使用すると役立つ場合があります。次に例を示します。
jstack -J-d64 -l <pid> >> threaddumps.log
-
jstack コマンド(
jstack -l <pid> >> threaddumps.log
)が以下のエラー[
1]
をスローした場合は、java プロセスを所有するユーザーとしてコマンドを実行します。 例:sudo -u sling jstack -l <pid> >> threaddumps.log
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
JSTACK スクリプト
次に、jstack を使用して一連のスレッドダンプを取得する スクリプト(eclipse.org のスクリプトから適応)を示します。 top コマンドを使用して、スレッドレベルの CPU 使用率も取得します。
次のように実行します。
sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>
例:sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3
- 1234 は Java プロセスの pid です
- cq5serveruser は、Java プロセスを実行する Linux または UNIX ユーザーです
- 10 は、実行するスレッドダンプの数です。
- 3 は、各ダンプ間の遅延です
メモ: トップ出力には 10 進数形式のネイティブスレッド ID が含まれるのに対して、jstack 出力には 16 進数形式の nid が含まれます。 スレッド ID を 16 進数に変換すると、トップ出力から jstack 出力に高い CPU スレッドを一致させることができます。
上記のスクリプトに加えて、同様の Windows Powershell スクリプトと、github のAdobe AEM固有のスクリプトもあります。
スレッドダンプを取得する代替方法
jstack ツールが使用できない場合は、次のようにスレッドダンプを取得できます。
注意: コマンドラインパラメーター -Xrs
が有効になっている場合、一部のツールは JVM からスレッドダンプを取得できません。 スレッドダンプの取得で問題が発生した場合は、このオプションが有効になっているかどうかを確認してください。
UNIX、Mac OS X、Linux (JDK 1.4 以前のバージョン)
UNIX、Mac OS X および Linux では、Java プロセスに QUIT シグナルを送信して、標準出力にスレッドダンプを出力するように指示できます。
-
次のコマンドを実行してこれを実行します。
kill -QUIT <pid>
「user」は Java プロセスが実行されているユーザーであるた
sudo -u user kill -QUIT <pid>
、このコマンドを実行する必要がある場合があります。 -
crx-quickstart/server/start
スクリプトを使用して CQSE を開始している場合、スレッドダンプがcrx-quickstart/server/logs/startup.log
に出力されます。 JBoss、WebSphere、Tomcat などのサードパーティのアプリケーションサーバーを使用している場合は、サーバーのドキュメントを参照して、標準出力の送信先となるファイルを確認してください。
Windows:
JDK 1.X
- javadump.exe (下記に添付)をダウンロードします。
- 次の 3 つの引数を指定して JVM を起動します(正しい順序である必要があります)。
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
- [Ctrl]+[Shift]+[Esc] を押して、タスク マネージャを開きます。
- Java プロセスの PID を確認します。
- コマンドラインから、
javadump.exe <pid>
を実行します。 - スレッドダンプは、手順 2 で示した
jvmoutput.log
ファイルに表示されます。
JDK 1.6
次のプラグインを使用して、jconsole ツールからスレッドダンプを取得します。[
0]
スレッドダンプをリクエストする方法は次のとおりです。
- Communique を実行している jvm に次のパラメーターを追加します。
Dcom.sun.management.jmxremote
- JDK 1.6 をダウンロードしてインストールします(まだインストールしていない場合)。
- スレッドダンプアナライザーユーティリティをダウンロードして抽出します。
[
1]
- JDK 1.6 の実
jconsole.exe
:jconsole.exe -pluginpath /path/to/file/tda.jar
- 「 スレッドダンプ タブをクリックします。
- リクエストスレッドダンプ リンクをクリックします。
メモ: AEM 6.x を実行していて、実行中のスレッドを監視する場合は、http://<host>:<port>/system/console/status-Threads
に対してスレッドリストの取得をリクエストできます。 ただし、これらのスレッドダンプは、samurai や tda などのスレッドダンプ分析ツールでは機能しないことに注意してください。
適用先:
JVM で実行しているすべてのAdobe製品
スレッドダンプ分析ツール
Microsoft ドキュメントの Sysinternals の [
0]
PsExec v2.42。
[
1]
TDA - スレッドダンプアナライザー(irockel/tda、Github.com)
FastThread の [
2]
Java Thread Dump Analyzer。
IBM サポートアシスタントのドキュメントの Java 用 [
3🔗 IBM スレッドおよびモニターダンプアナライザー ]
。