我有一个java应用程序,有一半时间只是挂起,而另一半JVM崩溃了。有没有一种工具可以用来查看发生了什么事情让它挂起和/或崩溃? 我正在使用CentOS 5.6
答案 0 :(得分:16)
对于初学者,我建议JVisualVM。它附带了JDK,因此您只需在命令行中键入jvisualvm
即可启动它。
一旦启动,您就可以连接到正在运行的JVM,因此您应该能够连接到挂起的Java进程并检查堆栈转储的所有正在运行的线程以及堆的内容。
其他有用的内置工具包括:
jps
列出了运行java进程的进程ID
jstack
为指定JVM进程中的每个线程打印堆栈转储
jmap
为指定的JVM进程生成堆转储(jvisualvm也可以生成堆转储)
jhat
分析使用jmap或jvisualvm生成的堆转储
当然,也有更复杂的剖面仪可用。 JProfiler受到高度重视。
答案 1 :(得分:15)
有两种不同的情况。
应用程序崩溃: 那是一个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 tools documentation提供了非常整洁的列表。它还链接Operating System Specific tools
答案 2 :(得分:2)
在这些情况下(挂起,冻结......),您必须分析堆转储以试图弄清楚应用程序中发生了什么,您可以使用JVisualVM来获取转储,或者您可以添加适当的JVM参数在崩溃的情况下转储堆的内容。