如何知道 JVM 因 Segfault 而崩溃的原因?



我们看到JVM有时会因段错误而崩溃。我们在日志中看到的唯一错误如下。

任何人都可以通过查看下面的错误跟踪来建议一些东西。


# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fef7f1d3eb0, pid=42623, tid=0x00007feea62c8700
#
# JRE version: OpenJDK Runtime Environment (8.0_222-b10) (build 1.8.0_222-b10)
# Java VM: OpenJDK 64-Bit Server VM (25.222-b10 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# J 62683 C2 org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.writeObject0(Ljava/lang/Object;)V (331 bytes) @ 0x00007fef7f1d3eb0 [0x00007fef7f1d3e00+0xb0]
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /tmp/hsperfdata_pvappuser/hs_err_pid42623.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp

在试图理解此崩溃的原因时,Oracle JVM文档 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/crashes001.html,这似乎是编译代码中的5.1.2崩溃的情况,因为有问题的帧是java帧(有一个"J"(

虽然不能离它更远,但我们也不确定它什么时候到来,唯一的概率模式是当 JVM 运行 5-6 天时,它就会出现,所以通常在星期五。 我们使用的是运行在RHEL 6.10上的RedHat提供的openjdk-8("1.8.0_232"(发行版。

期待在跟踪此错误方面获得任何领先点。

当前堆栈帧具有writeObject0作为最后一个调用的方法。有一个命名约定,native方法的名称以0结尾。因此,请检查该方法是否确实是本机方法。

如果是,它可能是用C编写的,C是一种古老的不安全语言,其程序往往会以不受控制的方式崩溃。这通常会导致SIGSEGV。

在这种情况下,该方法是用Java编写的。

正如错误消息中告诉您的那样,请阅读hs_err_pid42623.log以获取更多详细信息。在该文件中,您将找到寄存器和一些围绕崩溃代码的机器指令。

最新更新