【问题标题】:trying to view stack of unresponsive JVM : both jvisualvm and jconsole fail to connect试图查看无响应的 JVM 堆栈:visualvm 和 jconsole 都无法连接
【发布时间】:2014-03-17 16:33:50
【问题描述】:

我的本​​地计算机上有一个 Java 程序,该程序在一段时间后变得无响应,并且似乎在没有进一步进展的情况下冻结。我猜它在某处阻塞(它通过 HTTP 和 JDBC 访问远程资源,因此很可能出现阻塞情况)。我正在尝试连接到它以查看主线程堆栈的视图,以便了解块发生的位置。 jvisualvmjconsole 都列出了有问题的 JVM(以及在我的系统中运行的其他 JVM),但都无法连接。

jconsole 拒绝“连接失败”(即使我尝试了不安全的选项)。

jvisualvm 似乎已连接,但当我点击“采样器”选项卡查看堆栈时,它抱怨以下屏幕截图:

问题是我使用相同的实用程序(jconsolejvisualvm)连接到我系统中的其他 JVM任何问题。如何获取这个无响应 JVM 的堆栈以查看它阻塞的位置?

【问题讨论】:

    标签: jvm jconsole jvisualvm


    【解决方案1】:

    我今天遇到了一个类似的问题,JVM 完全卡住了,我无法正确地将 jconsole/jvisualvm 附加到它。 kill -3 <PID> 也失败了(没有线程转储)。

    我能够使用kill -11 <PID> 触发 JVM 的核心转储,并将其输入 jstack,如下所示:jstack /path/to/java /path/to/core.file。从 jstack 输出中,我能够提取一些有用的堆栈信息。

    【讨论】:

    • kill -11 最初响应“无法写入核心转储。核心转储已被禁用。要启用核心转储,请在再次启动 Java 之前尝试“ulimit -c unlimited” ”。运行 ulimit 后,内核就生成了。
    【解决方案2】:

    您可以使用kill -3 <PID>收集线程转储

    这将显示所有线程以及它们被阻塞的位置。

    【讨论】:

    • 这不是显示 JVM 代码的堆栈吗?我对 JVM 解释的 Java 代码的线程感兴趣。
    • 这将显示 VM 中的所有线程、应用程序和系统线程及其状态。然后,您可以查看线程阻塞的位置。
    • 好的,-3 和 -11 都适用于我的情况。我接受另一个答案,因为它还提到了 jstack 工具
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多