17

我有一个 java 应用程序,一半时间挂起,另一半 JVM 崩溃。有没有一种工具可以用来查看导致它挂起和/或崩溃的情况?我正在使用 CentOS 5.6

4

3 回答 3

21

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

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


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

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

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

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

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


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

于 2012-03-23T02:56:56.793 回答
17

有两种不同的情况。

应用程序崩溃: 那是 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 工具文档提供了非常简洁的列表。它还链接操作系统特定工具

于 2012-03-23T05:54:33.320 回答
2

在这些情况下(挂起、冻结、...),您必须分析堆转储以尝试找出应用程序中发生的情况,您可以使用 JVisualVM 进行转储,或者您可以添加适当的 JVM 参数来转储崩溃时堆的内容。

于 2012-03-23T06:40:29.353 回答