kill-3以获取java线程转储

zz2j4svz  于 2022-12-25  发布在  Java
关注(0)|答案(9)|浏览(178)

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

e5njpo68

e5njpo681#

你也可以使用jstack(包含在JDK中)来获取线程转储,然后把输出写到你想要的任何地方,这在unix环境中是不可用的吗?

jstack PID > outfile
r7s23pms

r7s23pms2#

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

ycl3bljg

ycl3bljg3#

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

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

euoag5mw4#

对于Java 8,jcmd是首选方法。

jcmd <PID> Thread.print

以下是Oracle documentation的代码片段:
JDK 8版本引入了Java使命Control、Java Flight Recorder和jcmd实用程序,用于诊断JVM和Java应用程序的问题。建议使用最新的jcmd实用程序,而不是以前的jstack实用程序,以增强诊断功能并降低性能开销。
然而,与应用程序一起运送这可能是许可的含义,我不确定。

vof42yt1

vof42yt15#

在JVM的stdout所在的相同位置。如果您有Tomcat服务器,这将是catalina_(date).out文件。

isr3a4wc

isr3a4wc6#

当使用kill -3时,应该在标准输出中看到线程转储。大多数应用服务器将标准输出写入一个单独的文件。当使用kill -3时,应该在那里找到它。有多种方法可以获得线程转储:

  • kill -3 <PID>:将输出提供给标准输出。
  • 如果可以访问服务器运行的控制台窗口,则可以使用Ctrl+Break组合键在STDOUT上生成堆栈跟踪。
  • 对于热点虚拟机,我们还可以使用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]
z18hc3ub

z18hc3ub7#

在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重定向到上面命令中指定的文件控制台。

qyuhtwio

qyuhtwio8#

1.查找进程ID [PS ID]
1.执行jcmd [PS ID]线程。打印

3pvhb19x

3pvhb19x9#

如果要执行独立Java进程的线程转储,应遵循的步骤

**步骤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

相关问题