如何调试JVM中的挂起线程?

时间:2012-06-06 14:09:49

标签: java multithreading debugging jvm remote-debugging

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

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

3 个答案:

答案 0 :(得分:2)

使用jvisualvm

连接到流程

此工具允许您连接到正在运行的进程并查看所有线程及其状态。这可以通过查看哪个线程始终处于清醒状态来向您显示哪个线程是罪魁祸首。您可以执行线程转储以查看每个线程的堆栈跟踪,并查看每个线程正在执行的操作。

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

您需要转发X显示才能生效。

答案 1 :(得分:2)

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

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

要连接到远程应用程序,请在远程服务器上运行jstatd,然后在本地运行VisualVM并输入服务器的IP地址。您应该获得一个正在运行的Java应用程序列表,包括您要探索的应用程序。如果您在列出应用程序时遇到任何问题,可以在VisualVM网站上找到好的文档。

答案 2 :(得分:1)

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