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

我有一个java应用程序,有一半时间只是挂起,另一半JVM崩溃。 有没有一个工具我可以用来看看是什么让它挂起和/或崩溃? 我正在使用CentOS 5.6

有两种不同的情况。

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

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

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

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

jps列出了运行java进程的进程ID

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

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

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

当然,也有更复杂的剖面仪可用。 JProfiler备受推崇。

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