【发布时间】:2010-12-24 01:37:31
【问题描述】:
当我遇到 JVM 崩溃时,我(作为一个对 JVM 内部原理一无所知的 Java 程序员)应该怎么做?
特别是,您将如何生成可重现的测试用例?我应该在 Sun(或 IBM)的错误数据库中搜索什么?我可以从生成的日志文件中获得哪些信息(例如hs_err_pidXYZ.log)?
【问题讨论】:
-
JVM 崩溃现在非常罕见,现在已经很严重了。我建议在此处发布崩溃时的日志输出。
当我遇到 JVM 崩溃时,我(作为一个对 JVM 内部原理一无所知的 Java 程序员)应该怎么做?
特别是,您将如何生成可重现的测试用例?我应该在 Sun(或 IBM)的错误数据库中搜索什么?我可以从生成的日志文件中获得哪些信息(例如hs_err_pidXYZ.log)?
【问题讨论】:
如果崩溃只发生在一台特定的机器上,请运行memtest。我只见过两次反复出现的 JVM 崩溃,而在这两种情况下,罪魁祸首都是硬件问题,即 RAM 故障。
【讨论】:
根据我的经验,它们几乎总是由使用 JNI 的本机代码引起的,无论是我的还是其他人的。如果可以,请尝试在不使用本机代码的情况下重新运行,看看是否可以重现它。
如果您的错误很容易重现,有时值得尝试使用the JIT compiler turned off。
正如其他人所指出的,有故障的硬件也可能导致这种情况,我在内存和显卡上都看到过(当崩溃发生在 swing 代码中时)。尝试运行最适合您系统的任何硬件诊断程序。
由于 JVM 崩溃很少见,我会将它们报告给 Sun。这可以在他们的bug database 完成。使用类别 Java SE、子类别 jvm_exact 或 jit。
在 Unix/Linux 下,您可能会得到核心转储。在 Windows 下,JVM 通常会告诉你它在哪里存储了发生的事情的日志。这些文件通常会给出一些提示,但会因 JVM 不同而有所不同。 Sun 提供了这些文件的完整详细信息on their website。或 IBM 可以使用来自 IBM alphaworks 的 Java Core Analyzer 和 Java heapdump Analyzer 分析文件。
不幸的是,根据我的经验,Java 调试器往往带来的伤害多于帮助。但是,如果您熟悉阅读 C 堆栈跟踪,则附加操作系统特定的调试器(例如 Visual Studio)会有所帮助。
尝试获得可重现的测试用例很难。如果您有大量总是(或几乎总是)崩溃的代码,那就更容易了,只需在它不断崩溃时慢慢删除部分,使结果尽可能小。如果您根本没有可重现的测试代码,那么这将非常困难。我建议从上面的编号选择中获得提示。
【讨论】:
当 iBM JVM 崩溃时,它可能已写入文件 /tmp/dump_locations,其中列出了它已写入的所有 heapdump 或 javacore 文件。
可以使用 IBM alphaworks 的 Java Core Analyzer 和 Java heapdump Analyzer 分析这些文件。
【讨论】:
【讨论】: