web-dev-qa-db-ja.com

-3を強制終了してJavaスレッドダンプを取得

kill -3コマンドを使用して、UnixのJVMのスレッドダンプを表示しています。しかし、このkillコマンドの出力はどこにありますか?迷っています!!

110
javanerd

または、jstack(JDKに含まれています)を使用してスレッドダンプを取得し、必要な場所に出力を書き込むこともできます。 UNIX環境では使用できませんか?

jstack PID > outfile
186
Joshua McKinnon

スレッドダンプは、kill -3を実行したVMからシステムに書き込まれます。 JVMのコンソール出力をファイルにリダイレクトする場合、スレッドダンプはそのファイルにあります。 JVMが開いているコンソールで実行されている場合、スレッドダンプがコンソールに表示されます。

40
Kris Babic

LogVMOutput診断オプション を使用して、ブレーク信号のJVMスレッドダンプ出力を個別のファイルにリダイレクトする方法があります。

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
29
Vadzim

Java 8の図では、jcmdが推奨されるアプローチです。

jcmd <PID> Thread.print

Oracle documentation の抜粋を次に示します。

JDK 8のリリースでは、Java Mission Control、Java Flight Recorder、およびJVMおよびJavaアプリケーションの問題を診断するためのjcmdユーティリティが導入されました。 診断の強化とパフォーマンスオーバーヘッドの削減のために、以前のjstackユーティリティの代わりに最新のユーティリティjcmdを使用することをお勧めします。

ただし、これをアプリケーションと一緒に出荷することは、ライセンスの意味合いである可能性がありますが、私にはわかりません。

21
Arnab Biswas

JVMの標準出力が配置されているのと同じ場所。 Tomcatサーバーがある場合、これはcatalina_(date).outファイルになります。

10
Daniel

Kill -3を使用すると、標準出力にスレッドダンプが表示されます。ほとんどのアプリケーションサーバーは、標準出力を別のファイルに書き込みます。 kill -3を使用すると、そこにあるはずです。スレッドダンプを取得する方法は複数あります。

  • Kill -3:標準出力に出力します。
  • サーバーが実行されているコンソールウィンドウにアクセスできる場合は、Ctrl + Breakキーの組み合わせを使用して、std出力にスタックトレースを生成できます。
  • ホットスポットVMの場合、jstackコマンドを使用してスレッドダンプを生成することもできます。 JDKの一部です。構文は次のとおりです。使用法:jstack [-l](実行中のプロセスに接続するため)jstack -F [-m] [-l](ハングしたプロセスに接続するため)
  • JRockit JVMの場合、JDK構文に付属するJRCMDコマンドを使用できます。jrcmd [[]] [-l] [-f file] [-p] -h]
8
Apoorve
  1. プロセスID [PS ID]を見つける
  2. Jcmd [PS ID] Thread.printを実行します
2
Mehmet Erdemsoy

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>

これにより、上記のコマンドで指定されたファイルコンソールに出力/スレッドがリダイレクトされます。

2
anish

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
1
Nick