我该如何诊断和防止JVM崩溃?

时间:2009-12-07 15:50:17

标签: java jvm crash

当我遇到JVM崩溃时,我应该做什么(作为一个对JVM内部不了解的Java程序员)呢?

特别是,您将如何生成可重现的测试用例?我应该在Sun(或IBM)的bug数据库中搜索什么?我可以从生成的日志文件中获取哪些信息(例如hs_err_pidXYZ.log)?

5 个答案:

答案 0 :(得分:7)

如果崩溃只发生在一台特定的机器上,请运行memtest。我已经看到重复发生的JVM崩溃只有两次,在这两种情况下,罪魁祸首都是硬件问题,即RAM故障。

答案 1 :(得分:5)

  1. 根据我的经验,他们几乎总是由使用JNI的本机代码引起的,无论是我的还是别人的。如果可以,请尝试在没有本机代码的情况下重新运行,看看是否可以重现它。

  2. 如果您的错误很容易重现,有时值得尝试使用the JIT compiler turned off

  3. 正如其他人所指出的那样,有缺陷的硬件也可能导致这种情况,我已经在内存和视频卡上看到过这种情况(当崩溃是在摇摆代码中时)。尝试运行最适合您系统的任何硬件诊断。

  4. 由于JVM崩溃很少见,我会向Sun报告。这可以在bug database处完成。使用类别Java SE,子类别jvm_exact或jit。

  5. 在Unix / Linux下,您可能会获得Core转储。在Windows下,JVM通常会告诉您它存储了已发生事件的日志。这些文件经常给出一些提示,但从JVM到JVM会有所不同。 Sun提供了这些文件on their website的完整详细信息。或IBM可以使用IBM的alphaworks中的Java Core AnalyzerJava heapdump Analyzer来分析文件。

  6. 不幸的是,根据我的经验,Java调试器往往比帮助更有害。但是,如果您熟悉读取C堆栈跟踪,则附加特定于OS的调试器(例如Visual Studio)可能会有所帮助。

  7. 尝试获得可重现的测试用例很难。如果你有大量的代码总是(或几乎总是)崩溃,那么就更容易了,只需在它不断崩溃的同时慢慢移除部件,使结果尽可能小。如果你根本没有可重复的测试代码,那就非常困难了。我建议从我上面的编号选项中获取提示。

答案 2 :(得分:2)

Sun记录了崩溃日志here的详细信息。还有一个很好的教程写了here,如果你想进入肮脏的细节(听起来你不这样做)

然而,正如评论者所提到的,JVM崩溃是一个非常罕见且严重的事件,在这种情况下调用Sun或IBM专业支持可能是值得的。

答案 3 :(得分:0)

当iBM JVM崩溃时,它可能已写入文件/tmp/dump_locations,在那里列出了它已编写的任何heapdump或javacore文件。

可以使用IBM的alphaworks中的Java Core AnalyzerJava heapdump Analyzer来分析这些文件。

答案 4 :(得分:0)

Oracle website上有一个很棒的页面来解决这些类型的问题。

查看相关部分: