【问题标题】:How do I debug hanging threads in the JVM?如何调试 JVM 中的挂起线程?
【发布时间】:2012-06-06 14:09:49
【问题描述】:

我在远程 Ubuntu 服务器上运行一个持久的 Java 程序,我拥有 root 用户权限。一段时间后,某些 CPU 内核的使用率上升到 100%。日志显示没有任何可疑之处,应用程序仍然可以运行,但吞吐量会降低。

如何调试 JVM,以便在它仍在运行时找出原因?

【问题讨论】:

    标签: java multithreading debugging jvm remote-debugging


    【解决方案1】:

    一个选项是VisualVM,它包含在从 Java 1.6 开始的 JDK 中。我发现它在过去的某些情况下很有用。

    您可以连接到本地应用程序或远程应用程序。

    要连接到远程应用,请在远程服务器上运行 jstatd,然后在本地运行 VisualVM 并输入服务器的 IP 地址。应该会为您提供一份正在运行的 Java 应用程序列表,其中包括您希望探索的应用程序。如果您在列出应用程序时遇到任何问题,VisualVM 网站上提供了很好的文档。

    【讨论】:

    • 谢谢!由于两个答案基本相同,所以我掷了一枚硬币,它选择了你的答案;)
    • 您实际使用了哪种方法? jstatd 还是 X 转发?
    • 我正在尝试使用 jstatd,因为我可以使用它进行进一步的监控和性能记录。
    【解决方案2】:

    使用jvisualvm连接到进程

    此工具将允许您连接到正在运行的进程并查看所有线程及其状态。这可以通过查看哪个线程一直处于清醒状态来告诉您哪个线程是罪魁祸首。您可以进行线程转储以查看每个线程的堆栈跟踪,并查看每个线程在做什么。

    对于这种调试来说,它是一个非常强大的工具。它仅与 JDK 一起分发,因此您需要的不仅仅是安装的 JVM 运行时才能访问。确保安装与运行 JVM 相同版本的 JDK。

    您需要转发您的 X 显示器才能使其正常工作。

    【讨论】:

    • 非常感谢,我试试看。
    【解决方案3】:

    如果您想查看 linux 上的堆栈跟踪,只需发出 kill -SIGQUIT <java-program-pid>。这是查看代码执行位置的一种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      相关资源
      最近更新 更多