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