kill -3は、Javaスレッドダンプを取得します


116

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


どのプロセスを殺していますか?J2EEアプリサーバーですか?その場合は、標準出力でスタックトレースを見つける必要があります。
Luciano Fiandesio

私はjavaクラスを実行するプロセスを殺しています
javanerd

2
コンソールにスレッドダンプを書き込むべきではありません。javaクラスはstd outとしてコンソールを持っているため
javanerd

回答:


194

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

jstack PID > outfile

1
はい-その時点で実行されます。追加のロック情報を出力する長いリストの場合は、-l(小文字のL)を指定することもできます
Joshua McKinnon

2
「アドレスからスレッドのタイプを推定できない」ためにjstackコマンドが一貫して失敗するまで;-(
noahlz

1
このエラーが表示される場合は、ベンダーに問い合わせることをお勧めします。クイック検索では、たとえば、このエラーとopenjdkに関してRHELに未解決のバグがあることがわかります...
Joshua McKinnon

7
jstackにはJDKが必要であることは注目に値します。JREのみがインストールされているサーバーでアプリを実行している場合は、スレッドダンプの別の方法を見つける必要があります。
jeffkempf 2017年

1
ここでは、Windowsのサービスのように、別のユーザーで実行中のプロセスのスレッドダンプを取得するためにjstack使用する方法である:stackoverflow.com/questions/1197912/...
ヴァジム

44

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


1
JVMスレッドダンプ出力を別のファイルにリダイレクトする方法があります。私の答えで見てください。
Vadzim 2013年

32

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

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

5
技術的には、これはスレッドダンプ出力を「リダイレクト」しません。JVMロギングをjvm.log(スレッドダンプ出力を含む)にオンにしますが、kill -QUITはプロセスのstdout(同様に)にダンプします。あいまいなJVMオプションの説明に
賛成

25

画像でjcmdはJava 8が推奨されるアプローチです。

jcmd <PID> Thread.print

以下は、Oracleのドキュメントの抜粋です。です。

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

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


1
あいにくjcmdと、Windowsのサービス・プロセスへの接続に失敗com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachしばらくjstack -F:成功stackoverflow.com/questions/1197912/...
ヴァジム・

1
jcmd <pid> Thread.dumpをjavaプロセスと同じユーザーで実行する必要があります。そうしないと、接続が切断されます。stackoverflow.com/questions/25438983/…を
Twilite

11

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


8

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

  • kill -3 <PID>:標準出力に出力します。
  • サーバーが実行されているコンソールウィンドウにアクセスできる場合、Ctrl+ Breakキーの組み合わせを使用して、STDOUTにスタックトレースを生成できます。
  • ホットスポットVMの場合は、jstackコマンドを使用してスレッドダンプを生成することもできます。これはJDKの一部です。構文は次のとおりです。

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]

Kill -3 <PID>の使用に問題があります。正常に動作しますが、スレッドダンプをコンソールに書き込んだ後もプロセスを強制終了します。それを行うことになっていますか?
アシュリー

@Ashley- kill -3 <PID>JVMを強制終了しないでください。どのタイプのJavaアプリを見ていますか?
slm

2

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.