我正在使用kill -3
命令在unix中查看JVM的线程转储。但是我在哪里可以找到此kill
命令的输出?我迷路了!!
答案 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时找到它。有多种获取线程转储的方法:
答案 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)
答案 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