我有一个 java 应用程序,一半时间挂起,另一半 JVM 崩溃。有没有一种工具可以用来查看导致它挂起和/或崩溃的情况?我正在使用 CentOS 5.6
3 回答
对于初学者,我建议JVisualVM。它带有 JDK,因此您只需要jvisualvm
在命令行中键入即可启动它。
一旦启动,您就可以连接到正在运行的 JVM,因此您应该能够连接到挂起的 Java 进程并检查堆栈转储中所有正在运行的线程以及堆的内容。
其他有用的内置工具包括:
jps
列出正在运行的 java 进程的进程 ID
jstack
打印指定 JVM 进程中每个线程的堆栈转储
jmap
为指定的JVM进程生成堆转储(jvisualvm也可以生成堆转储)
jhat
分析使用 jmap 或 jvisualvm 生成的堆转储
当然,还有更复杂的分析器可用。JProfiler非常受推崇。
有两种不同的情况。
应用程序崩溃: 那是 OOM 吗?NPE?有什么例外?如果出现 jvm 崩溃,您将看到 hs_err_.log ( http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf )
查看该文件,您可能会看到您自己的 JNI 是否导致了崩溃或 JVM 错误。
应用程序挂起:我会从 visualvm 或 jstat(两者都是 JDK 的一部分)开始。您可以查看线程的当前状态并检查是否有任何应用程序错误..
其他有助于查看内部进程的linux 工具:
Oracle 工具文档提供了非常简洁的列表。它还链接操作系统特定工具
在这些情况下(挂起、冻结、...),您必须分析堆转储以尝试找出应用程序中发生的情况,您可以使用 JVisualVM 进行转储,或者您可以添加适当的 JVM 参数来转储崩溃时堆的内容。