我的本地计算机上有一个Java程序在一段时间后变得没有响应,并且似乎冻结而没有取得进一步的进展。我想它会阻塞某个地方(它通过HTTP和JDBC访问远程资源,因此可能会出现阻塞情况)。我试图连接到它以查看主线程的堆栈的视图,以便了解块发生的位置。 jvisualvm
和jconsole
都列出了有问题的JVM(在我的系统中运行的其他JVM),但两者都无法连接。
jconsole
使用“连接失败”(即使我尝试使用不安全的选项)。
jvisualvm
似乎已连接,但当我点击'sampler'标签查看堆栈时,它会通过以下屏幕截图进行投诉:
问题是我正在使用相同的实用程序(jconsole
和jvisualvm
)来连接我系统中的其他JVM,而我没有使用in this answer提到的任何JMX选项我没有任何问题。如何获取这个无响应的JVM堆栈以查看它阻塞的位置?
答案 0 :(得分:2)
今天我遇到了一个类似的问题,一个完全卡住的JVM,我无法正确地将jconsole / jvisualvm附加到它上面。此外kill -3 <PID>
未成功(没有线程转储)。
我能够使用kill -11 <PID>
触发JVM的coredump并将其提供给jstack,如下所示:jstack /path/to/java /path/to/core.file
。从jstack输出我能够提取一些有用的堆栈信息。
答案 1 :(得分:1)
您可以使用kill -3 <PID>
收集主题转储。
这将显示所有线程及其被阻止的位置。