JVM致命错误日记(hs_err_pid.log)说明语言&工具

来源:互联网 / 作者:SKY / 2017-02-16 21:55 / 点击:
当jvm呈现致命错误时,会天生一个错误文件hs_err_pidpid.log,个中包罗了导致jvm crash的重要信息,可以通过说明该文件定位到导致crash的来源,从而改进以担保体系不变。当呈现crash时,该文件默认会天生到事变目次下,然 而可以通过jvm参数指定天生路径(

当jvm呈现致命错误时,会天生一个错误文件 hs_err_pid<pid>.log,个中包罗了导致jvm crash的重要信息,可以通过说明该文件定位到导致crash的来源,从而改进以担保体系不变。当呈现crash时,该文件默认会天生到事变目次下,然 而可以通过jvm参数指定天生路径(JDK6中引入):

JVM致命错误日志(hs_err_pid.log)声名

-XX:ErrorFile=./hs_err_pid<pid>.log

该文件包括如下几类要害信息:

日记头文件

导致crash的线程信息

全部线程信息

安详点和锁信息

堆信息

当地代码缓存

编译变乱

gc相干记录

jvm内存映射

jvm启动参数

处事器信息

下面用一个crash demo文件慢慢解读这些信息,以便各人往后遇到crash时利便说明。

日记头文件

日记头文件包括提纲信息,简述了导致crash的缘故起因。而导致crash的缘故起因许多,常见的缘故起因有jvm自身的bug,应用措施错误,jvm参数设置不妥,处事器资源不敷,jni挪用错误等。

此刻参考下如下描写:

# A fatal error has been detected by the Java Runtime Environment: 

#  SIGSEGV (0xb) at pc=0x00007fb8b18fdc6c, pid=191899, tid=140417770411776 

# JRE version: Java(TM) SE Runtime Environment (7.0_55-b13) (build 1.7.0_55-b13) 

# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.55-b03 mixed mode linux-amd64 compressed oops) 

# Problematic frame: 

# J  org.apache.http.impl.cookie.BestMatchSpec.formatCookies(Ljava/util/List;)Ljava/util/List; 

# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again 

# If you would like to submit a bug report, please visit: 

#   http://bugreport.sun.com/bugreport/crash.jsp 

这里一个重要信息是“SIGSEGV(0xb)”暗示jvm crash时正在执行jni代码,而不是在执行java可能jvm的代码,假如没有在应用措施里手动挪用jni代码,那么很也许是JIT动态编译时导致的 该错误。个中SIGSEGV是信号名称,0xb是信号码,pc=0x00007fb8b18fdc6c指的是措施计数器的值,pid=191899是历程 号,tid=140417770411776是线程号。

PS:除了“SIGSEGV(0xb)”以外,常见的描写尚有“EXCEPTION_ACCESS_VIOLATION”,该描写暗示jvm crash时正在执行jvm自身的代码,这每每是由于jvm的bug导致的crash;另一种常见的描写是 “EXCEPTION_STACK_OVERFLOW”,该描写暗示这是个栈溢出导致的错误,这每每是应用措施中存在深层递归导致的。

尚有一个重要信息是:

# Problematic frame:

# J org.apache.http.impl.cookie.BestMatchSpec.formatCookies(Ljava/util/List;)Ljava/util/List;

这暗示呈现crash时jvm正在执行的代码,这里的“J”暗示正在执行java代码,后头的暗示执行的要领栈。除了“J”外,尚有也许是“C”、“j”、“V”、“v”,它们别离暗示:

C: Native C frame

j: Interpreted Java frame

V: VMframe

v: VMgenerated stub frame

J: Other frame types, including compiled Java frames

加上前面临SIGSEGV(0xb)”的说明,此刻可以断定是JIT动态编译导致的该错误。

查阅资料发明:

此非常是因为jdk JIT compiler optimization 导致,bug id 8021898,官网描写如下:

The JIT compiler optimization leads to a SIGSEGV or an NullPointerException at a place it must not happen.

jdk1.7.0_25到1.7.0_55这几个版本都存在此bug,1.7.0_60后修复。可通过进级jdk办理此非常,可参考 ?bug_id=8021898。

到这里该题目已经说明出缘故起因了,可是咱们可以再深入一步,说明下其余信息。

导致crash的线程信息

文件下面是导致crash的线程信息和该线程栈信息,描写信息如下:

Current thread (0x00007fb7b4014800):  JavaThread "catalina-exec-251" daemon [_thread_in_Java, id=205044, stack(0x00007fb58f435000,0x00007fb58f536000)]

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000003f96dc9c6c

以上暗示导致堕落的线程是0x00007fb7b4014800(指针),线程范例是JavaThread,JavaThread暗示执行的是java线程,关于该线程其余范例还也许是:

VMThread:jvm的内部线程

CompilerThread:用来挪用JITing,及时编译装卸class 。 凡是,jvm会启动多个线程来处理赏罚这部门事变,线程名称后头的数字也会累加,譬喻:CompilerThread1

GCTaskThread:执行gc的线程

WatcherThread:jvm周期性使命调治的线程,是一个单例工具。 该线程在JVM内行使得较量频仍,好比:按期的内存监控、JVM运行状况监控,尚有我们常常必要去执行一些jstat 这类呼吁查察gc的环境

阅读延展

1
3