杀-3获得Java线程转储
我正在使用kill -3
命令查看unix中JVM的线程转储。 但是我在哪里可以find这个kill
命令的输出? 我搞不清楚了!!
您也可以使用jstack(包含在JDK中)进行线程转储,并将输出写入任意位置。 这不是在unix环境中可用吗?
jstack PID > outfile
将线程转储写入到您执行kill -3的虚拟机之外的系统。 如果将JVM的控制台输出redirect到文件,则线程转储将位于该文件中。 如果JVM在打开的控制台中运行,则线程转储将显示在其控制台中。
有一种方法可以将中断信号上的JVM线程转储输出redirect到与LogVMOutput诊断选项分离的文件:
-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应用程序的问题。 build议使用最新的实用程序jcmd而不是以前的jstack实用程序来增强诊断并降低性能开销。
但是,与应用程序一起发货可能是我不确定的许可问题。
在JVM的stdout被放置在相同的位置。 如果你有一个Tomcat服务器,这将是catalina_(date).out
文件。
当使用kill -3时,应该在标准输出中看到线程转储。 大多数应用程序服务器将标准输出写入单独的文件。 在使用kill -3时你应该在那里find它。 有多种获取线程转储的方法:
- 杀死-3:给出标准输出。
- 如果可以访问运行服务器的控制台窗口,则可以使用Ctrl + Break组合键在标准输出上生成堆栈跟踪。
- 对于热点VM,我们也可以使用jstack命令来生成线程转储。 这是JDK的一部分。 语法如下:用法:jstack [-l](连接到正在运行的进程)jstack -F [-m] [-l](连接到挂起的进程)
- 对于JRockit JVM,我们可以使用JDK附带的JRCMD命令语法:jrcmd [[]] [-l] [-f file] [-p] -h]
在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>
这会将你的output / threadumpredirect到上述命令指定的文件控制台。
- find进程ID [PS ID]
- 执行jcmd [PS ID] Thread.print
如果您需要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调用的subprocessID。 使用上面的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