kill -3来获取java线程转储

时间:2011-02-02 15:27:07

标签: java multithreading dump

我正在使用kill -3命令在unix中查看JVM的线程转储。但是我在哪里可以找到此kill命令的输出?我迷路了!!

9 个答案:

答案 0 :(得分:178)

您也可以使用jstack(包含在JDK中)进行线程转储并将输出写入您想要的任何位置。这在unix环境中不可用吗?

jstack PID > outfile

答案 1 :(得分:36)

线程转储从执行kill -3的VM写入系统。如果要将JVM的控制台输出重定向到文件,则线程转储将位于该文件中。如果JVM在打开的控制台中运行,则线程转储将显示在其控制台中。

答案 2 :(得分:27)

有一种方法可以将中断信号上的JVM线程转储输出重定向到使用LogVMOutput diagnostic option的单独文件:

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

答案 3 :(得分:20)

使用Java 8,jcmd是首选方法。

jcmd <PID> Thread.print

以下是Oracle documentation的摘要:

JDK 8的发布引入了Java Mission Control,Java Flight Recorder和jcmd实用程序,用于诊断JVM和Java应用程序的问题。 建议使用最新的实用程序jcmd代替以前的jstack实用程序,以增强诊断并降低性能开销。

但是,将此与应用程序一起发送可能会产生许可问题,我不确定。

答案 4 :(得分:8)

放置JVM标准输出的位置。如果您有Tomcat服务器,那么这将是catalina_(date).out文件。

答案 5 :(得分:7)

使用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]

答案 6 :(得分: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>

这会将您的输出/ threadump重定向到上述命令中指定的文件控制台。

答案 7 :(得分:2)

  1. 查找进程ID [PS ID]
  2. 执行jcmd [PS ID] Thread.print

答案 8 :(得分:1)

如果您想要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