如何调查 JVM 崩溃的原因?

2022-09-01 16:12:38

一天前,经过几个月的正常工作,我们的Java应用程序偶尔开始崩溃,并出现以下错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (safepoint.cpp:247), pid=2075, tid=140042095163136
#  guarantee(PageArmed == 0) failed: invariant
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.0-b09 mixed mode linux-amd64 compressed oops)
# An error report file with more information is saved as:
# /var/chat/jSocketer/build/hs_err_pid2075.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

我查看了hs_err_pid2075.log,发现有一个活动线程,用于处理网络通信。但是,在过去的几个月里,没有进行任何应用程序或环境更改。此外,负载也没有任何增长。我能做些什么来理解,崩溃的原因是什么?是否有任何常见步骤来调查 jvm 崩溃?

UPD http://www.wuala.com/ubear/public


答案 1

崩溃是在 JVM 中,而不是在外部本机代码中。但是,它崩溃的操作已由 外部 DLL 启动。

hs_err_pid文件中的以下行解释了崩溃的操作:

VM_Operation (0x00007f5e16e35450): GetAllStackTraces, mode: safepoint, requested by thread 0x0000000040796000

现在,线程0x0000000040796000是

0x0000000040796000 JavaThread "YJPAgent-Telemetry" daemon [_thread_blocked, id=2115, stack(0x00007f5e16d36000,0x00007f5e16e37000)]

这是由Yourkit创建的线程。“GetAllStackTraces”是探查器需要调用才能进行采样的东西。如果删除探查器,则不会发生崩溃。

使用此信息无法说明导致崩溃的原因,但可以尝试以下操作:删除所有 -XX VM 参数、-verbose:gc 和调试 VM 参数。它们可能会干扰 JVM 的性能分析接口。

更新

调用或可能触发相同崩溃的代码java.lang.Thread#getAllStackTraces()java.lang.Thread#getStackTrace()


答案 2

我目睹的两次反复发生的JVM崩溃都是由于硬件故障,即RAM。运行内存测试实用程序是我尝试的第一件事。


推荐