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

Posted

技术标签:

【中文标题】我应该如何诊断和防止 JVM 崩溃?【英文标题】:How should I diagnose and prevent JVM crashes? 【发布时间】:2010-12-24 01:37:31 【问题描述】:

当我遇到 JVM 崩溃时,我(作为一个对 JVM 内部原理一无所知的 Java 程序员)应该怎么做?

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

【问题讨论】:

JVM 崩溃现在非常罕见,现在已经很严重了。我建议在此处发布崩溃时的日志输出。 【参考方案1】:

如果崩溃只发生在一台特定的机器上,请运行memtest。我只见过两次反复出现的 JVM 崩溃,而在这两种情况下,罪魁祸首都是硬件问题,即 RAM 故障。

【讨论】:

+1 表示有故障的硬件是主要候选者。错误纠正 ram 是一件好事。 接受,因为这不是我考虑过的事情,很可能是答案。【参考方案2】:

    根据我的经验,它们几乎总是由使用 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)会有所帮助。

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

当 iBM JVM 崩溃时,它可能已写入文件 /tmp/dump_locations,其中列出了它已写入的所有 heapdump 或 javacore 文件。

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

【讨论】:

如果我对 JVM 内部一无所知,我能做到吗? 是的,分析器显示 Java 核心和对象树的线程、锁和可能的死锁以及 Java 堆的可能内存泄漏。两者都可以指出问题的根源。【参考方案5】:

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

查看相关部分:

Hung Processes(例如jstack 实用程序) Post Mortem diagnostics

【讨论】:

以上是关于我应该如何诊断和防止 JVM 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

实现 CSS:导航栏由于侧导航而崩溃 - 如何防止?

如何防止错误输入导致应用程序崩溃。 Python、HTML 和 CSS

如何诊断和解决 WCSession sendMessage(_:replyHandler:errorHandler:) 上的崩溃?

如何在“找不到文件”错误后增加 VBA 错误输出以诊断一致崩溃

如何编写 ADPlus 脚本以方便客户用于诊断崩溃和挂起

如何诊断 iPad iPhone 应用程序中的 EXC_BREAKPOINT (SIGTRAP) 崩溃?