如何调查JVM崩溃的原因?
一天前,经过几个月的正常工作,我们的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
回答:
崩溃发生在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()
可能触发相同崩溃的代码
以上是 如何调查JVM崩溃的原因? 的全部内容, 来源链接: utcz.com/qa/399068.html