用于调试 Java 应用程序中挂起的工具

2022-09-02 19:58:44

我有一个Java应用程序,一半时间只是挂起,另一半JVM崩溃。有没有一个工具可以用来查看正在发生的事情,使它挂起和/或崩溃?我使用的是 CentOS 5.6


答案 1

对于初学者,我建议使用JVisualVM。它附带JDK,因此您只需要在命令行中键入即可启动它。jvisualvm

一旦它启动,您就可以连接到正在运行的JVM,因此您应该能够连接到挂起的Java进程并检查堆栈转储中所有正在运行的线程以及堆的内容。


其他有用的内置工具包括:

jps列出正在运行的 Java 进程的进程 ID

jstack为指定的 JVM 进程中的每个线程打印堆栈转储

jmap为指定的 JVM 进程生成堆转储(jvisualvm 也可以生成堆转储)

jhat分析使用 jmap 或 jvisualvm 生成的堆转储


此外,还有更复杂的分析器可用。JProfiler非常受推崇。


答案 2

有两种不同的情况。

应用程序崩溃:这是OOM吗?NPE?例外情况是什么?如果发生jvm崩溃,您将看到hs_err_.log(http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf)

查看该文件,您可能会看到您自己的JNI是否导致了崩溃或JVM错误。

应用程序挂起:我会从visualvm或jstat开始(两者都是JDK的一部分)。您可以查看线程的当前状态并检查是否存在任何应用程序错误。

其他可以帮助查看内部进程的linux工具

  • lsof : 您可以检查该进程是否打开了太多文件
  • strace:从系统调用的角度查看当前活动。

Oracle工具文档提供了非常整洁的列表。它还链接了特定于操作系统的工具