【问题标题】:What can I do if a Java VM crashes repeatedly?如果 Java VM 反复崩溃,我该怎么办?
【发布时间】:2010-09-18 12:29:24
【问题描述】:

如果满足以下条件,解决 Java VM 崩溃的最佳做法是:

  • 没有自己的或第三方的本机代码。 100% 纯 java
  • 相同的程序在许多其他系统上运行没有任何问题。

PS:VM 崩溃的意思是,VM 写了一个像 hs_err_pid1234.log 这样的转储文件并终止。

【问题讨论】:

  • 哪个操作系统/平台? (我们知道 java 是独立于平台的 :-)
  • 100% 纯 Java 仍然使用可能会崩溃的本机代码。
  • @XL-Plüschhase:没有特定的操作系统/平台。我们有大约安装基础。 100.000 个系统。只有少数系统在不同的操作系统/平台上崩溃。

标签: java crash virtual-machine


【解决方案1】:

读取 hs_err_pid1234.log 文件(或任何错误日志文件名)。里面一般都有线索。下一步取决于您在日志中发现的内容。

是的,这可能是您正在使用的特定 JVM 实现版本中的错误,但我也看到了操作系统中内存碎片引起的问题。例如,Windows 很容易将 dll 固定在不适当的位置,因此当 JVM 要求时无法分配连续的内存块。其他 out opf 内存问题也可以通过这种类型的故障转储表现出来。

【讨论】:

    【解决方案2】:

    更新或更换您的 JVM。如果您当前拥有最新版本,请尝试使用旧版本,或者如果您没有最新版本,请尝试更新到它。也许它在您的特定版本中是一个已知问题?

    【讨论】:

      【解决方案3】:

      假设跨机器的JVM版本是一样的:

      弄清楚 JVM 崩溃的机器有什么不同。相同的OSOS 版本?例如,我们遇到了 JVM 在特定版本的 Red Hat 上崩溃的问题。而且我们还发现一些旧的 Red Hat 版本无法正确处理额外的内存,导致交换空间不足。 (我们的解决方案是升级 RedHat)。

      另外,程序在机器上做的事情完全是一样的吗?它是否访问共享文件系统?文件系统是否以类似方式安装在您的机器上(SMB/NFS 等)?一定有什么不同。

      日志文件应该让您了解崩溃发生的位置(例如malloc)。

      【讨论】:

        【解决方案4】:

        查看转储文件中的堆栈跟踪,因为它应该告诉您崩溃发生时发生了什么。

        除了深入研究hs_err 转储文件之外,我还将它提交给Sun 或任何制作您的JVM 的人(我相信文件顶部有关于如何执行此操作的说明?)。不会痛的。

        【讨论】:

          【解决方案5】:

          32 位? 64位?客户端机器中的内存量?处理器?操作系统?查看系统之间是否有任何连接。一个连接可能会导致一个线索。如果一切都失败了,请考虑使用不同的主要/次要版本的 JVM。此外,如果问题刚刚开始,您能否到达程序没有崩溃的时间(通过版本控制)?查看 hs_err 日志,您可能会了解导致崩溃的原因。它可能是 JVM 使用的其他一些客户端库的一个版本。最后,在 debug/profile 中运行程序,也许你会在崩溃前看到一些症状(假设你可以复制它)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-25
            • 2016-12-12
            • 1970-01-01
            • 1970-01-01
            • 2011-09-14
            • 2012-08-16
            相关资源
            最近更新 更多