kill -3
コマンドを使用して、UnixのJVMのスレッドダンプを表示しています。しかし、このkill
コマンドの出力はどこにありますか?迷っています!!
または、jstack(JDKに含まれています)を使用してスレッドダンプを取得し、必要な場所に出力を書き込むこともできます。 UNIX環境では使用できませんか?
jstack PID > outfile
スレッドダンプは、kill -3を実行したVMからシステムに書き込まれます。 JVMのコンソール出力をファイルにリダイレクトする場合、スレッドダンプはそのファイルにあります。 JVMが開いているコンソールで実行されている場合、スレッドダンプがコンソールに表示されます。
LogVMOutput診断オプション を使用して、ブレーク信号のJVMスレッドダンプ出力を個別のファイルにリダイレクトする方法があります。
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Java 8の図では、jcmd
が推奨されるアプローチです。
jcmd <PID> Thread.print
Oracle documentation の抜粋を次に示します。
JDK 8のリリースでは、Java Mission Control、Java Flight Recorder、およびJVMおよびJavaアプリケーションの問題を診断するためのjcmdユーティリティが導入されました。 診断の強化とパフォーマンスオーバーヘッドの削減のために、以前のjstackユーティリティの代わりに最新のユーティリティjcmdを使用することをお勧めします。
ただし、これをアプリケーションと一緒に出荷することは、ライセンスの意味合いである可能性がありますが、私にはわかりません。
JVMの標準出力が配置されているのと同じ場所。 Tomcatサーバーがある場合、これはcatalina_(date).out
ファイルになります。
Kill -3を使用すると、標準出力にスレッドダンプが表示されます。ほとんどのアプリケーションサーバーは、標準出力を別のファイルに書き込みます。 kill -3を使用すると、そこにあるはずです。スレッドダンプを取得する方法は複数あります。
Jbossでは、以下を実行できます
Nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
kill -3 <Java_pid>
これにより、上記のコマンドで指定されたファイルコンソールに出力/スレッドがリダイレクトされます。
StandAlone Javaプロセスのスレッドダンプが必要な場合に従うべき手順
ステップ1: Javaプログラムを呼び出すシェルスクリプトのプロセスIDを取得する
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
ステップ2: runABCDによって呼び出された子のプロセスIDを取得します。上記のPIDを使用して、子を取得します。
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/Java/jdk/Sun4/SunOS5/1.6.0_16/bin/Java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
ステップ3:特定のプロセスのJSTACKを取得します。 XYSServerプロセスのプロセスIDを取得します。すなわち8536
linux$ jstack **8536** > threadDump.log