【发布时间】:2012-06-06 14:09:49
【问题描述】:
我在远程 Ubuntu 服务器上运行一个持久的 Java 程序,我拥有 root 用户权限。一段时间后,某些 CPU 内核的使用率上升到 100%。日志显示没有任何可疑之处,应用程序仍然可以运行,但吞吐量会降低。
如何调试 JVM,以便在它仍在运行时找出原因?
【问题讨论】:
标签: java multithreading debugging jvm remote-debugging
我在远程 Ubuntu 服务器上运行一个持久的 Java 程序,我拥有 root 用户权限。一段时间后,某些 CPU 内核的使用率上升到 100%。日志显示没有任何可疑之处,应用程序仍然可以运行,但吞吐量会降低。
如何调试 JVM,以便在它仍在运行时找出原因?
【问题讨论】:
标签: java multithreading debugging jvm remote-debugging
一个选项是VisualVM,它包含在从 Java 1.6 开始的 JDK 中。我发现它在过去的某些情况下很有用。
您可以连接到本地应用程序或远程应用程序。
要连接到远程应用,请在远程服务器上运行 jstatd,然后在本地运行 VisualVM 并输入服务器的 IP 地址。应该会为您提供一份正在运行的 Java 应用程序列表,其中包括您希望探索的应用程序。如果您在列出应用程序时遇到任何问题,VisualVM 网站上提供了很好的文档。
【讨论】:
jstatd 还是 X 转发?
使用jvisualvm连接到进程
此工具将允许您连接到正在运行的进程并查看所有线程及其状态。这可以通过查看哪个线程一直处于清醒状态来告诉您哪个线程是罪魁祸首。您可以进行线程转储以查看每个线程的堆栈跟踪,并查看每个线程在做什么。
对于这种调试来说,它是一个非常强大的工具。它仅与 JDK 一起分发,因此您需要的不仅仅是安装的 JVM 运行时才能访问。确保安装与运行 JVM 相同版本的 JDK。
您需要转发您的 X 显示器才能使其正常工作。
【讨论】:
如果您想查看 linux 上的堆栈跟踪,只需发出 kill -SIGQUIT <java-program-pid>。这是查看代码执行位置的一种方法。
【讨论】: