我正在使用kill -3
命令在UNIX中查看JVM的线程转储。但是在哪里可以找到此kill
命令的输出?我搞不清楚了!!
我正在使用kill -3
命令在UNIX中查看JVM的线程转储。但是在哪里可以找到此kill
命令的输出?我搞不清楚了!!
Answers:
您也可以使用jstack(JDK附带)进行线程转储并将输出写入所需的任何位置。在UNIX环境中不可用吗?
jstack PID > outfile
线程转储将从您在其上执行过的VM写入系统kill -3
。如果要将JVM的控制台输出重定向到文件,则线程转储将在该文件中。如果JVM在打开的控制台中运行,则线程转储将显示在其控制台中。
使用LogVMOutput诊断选项,可以使用中断信号将JVM线程转储输出重定向到单独的文件:
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
在使用Java 8时,jcmd
是首选方法。
jcmd <PID> Thread.print
以下是Oracle文档的摘录:
JDK 8的发行版引入了Java Mission Control,Java Flight Recorder和jcmd实用程序,用于诊断JVM和Java应用程序的问题。建议使用最新的实用程序jcmd代替以前的jstack实用程序,以增强诊断功能并降低性能开销。
但是,随应用程序一起提供此功能可能会带来许可问题,但我不确定。
jcmd
,com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
虽然jstack -F
成功,但无法连接到Windows服务进程:stackoverflow.com/questions/1197912/…–
当使用kill -3时,应该在标准输出中看到线程转储。大多数应用程序服务器将标准输出写入单独的文件。使用kill -3时,您应该在那里找到它。有多种获取线程转储的方法:
kill -3 <PID>
:将输出提供给标准输出。对于热点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>
应该杀死JVM。您正在查看哪种类型的Java应用程序?
如果要StandAlone Java Process的线程转储,应遵循的步骤
步骤1:获取调用Java程序的shell脚本的进程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