kill -3来获取java线程转储

jav*_*erd 112 java multithreading dump

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

Jos*_*non 189

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

jstack PID > outfile
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是jstack需要JDK.如果您在仅安装了JRE的服务器上运行应用程序,则需要找到另一种线程转储方法. (6认同)
  • 直到jstack命令因"无法从地址推断出线程类型"而一直失败;-( (2认同)

Kri*_*bic 42

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

  • 有一种方法可以将 JVM 线程转储输出重定向到单独的文件。请看我的回答。 (2认同)

Vad*_*zim 30

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

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,这不会"重定向"线程转储输出.它打开JVM登录到jvm.log(包括线程转储输出),但kill -QUIT仍然会转储到进程的stdout(aswell).为晦涩的JVM选项的描述而投票赞成:) (5认同)

Arn*_*was 21

使用Java 8图片,jcmd是首选方法.

jcmd <PID> Thread.print
Run Code Online (Sandbox Code Playgroud)

以下是Oracle文档的片段:

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

但是,随应用程序运送此产品可能会产生许可影响,我不确定.

  • 不幸的是,`jcmd` 无法通过 `com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or enough privileges to attach` 连接到 Windows 服务进程,而 `jstack -F` 成功:/sf/ask/83853871/ /cant-debug-java-windows-services-with-jhat-jps-jstack/47723393#47723393 (2认同)
  • 您需要在与 java 进程相同的用户下运行 jcmd &lt;pid&gt; Thread.dump ,否则您的连接将被丢弃。请参阅 /sf/ask/1780728841/ (2认同)

Dan*_*iel 10

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


小智 8

当使用kill -3时,应该在标准输出中看到线程转储.大多数应用程序服务器将标准输出写入单独的文件.你应该在使用kill -3时找到它.有多种获取线程转储的方法:

  • 杀-3:输出到标准输出.
  • 如果可以访问运行服务器的控制台窗口,可以使用Ctrl + Break组合键在std输出上生成堆栈跟踪.
  • 对于热点VM,我们也可以使用jstack命令生成线程转储.它是JDK的一部分.语法如下:用法:jstack [-l](连接到正在运行的进程)jstack -F [-m] [-l](连接到挂起的进程)
  • 对于JRockit JVM,我们可以使用JDK语法附带的JRCMD命令:jrcmd [[]] [-l] [-f file] [-p] -h]