有一次服务器jvm crash,无任何异常信息。后来想想不对啊,除非是人为的将java的进程kill掉,要不然不可能没有错误日志的,后来突然想起上次价格行情做性能测试时,当jvm crash掉之后,是在命令目录下会生成一个hs_err_pid*****.log文件的,于是找到那个文件,下面是分析过程,这个文件有几部分内容,首先是头部信息,头信息包含了出错的大体信息和位置。
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00002b0d8002534e, pid=3594, tid=1093806400
#
# JRE version: 6.0_18-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.0-b13 mixed mode linux-amd64 )
#
# Problematic frame:
# V [libjvm.so+0x2de34e]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
在这部分中,有三块内容需要我们注意,一是SIGSEGV是一个信号名称,表示这是一个建立CORE文件段的非法错误;二是指明了运行环境,jre版本以及jvm版本;三是最重要的信息,它指明了出错的地方,这里V表示一种frame type,这里是指vmframe,而中括号里则表示出错是在libjvm.so这个文件里,具体位置的偏移量为+号后面的数据。由这里可以知道这是由于jvm自身运行错误导致。
这个文件的第二部分则是当前处理的线程,或者说是当jvm crash时在运行的线程,详细内容如下:
--------------- T H R E A D ---------------
Current thread (0x0000000056406800): GCTaskThread [stack:
0x0000000041222