JVM致命错误日志详解(二)
| Segmentation violation (ANSI). |
SIGUSR2 |
12 |
User-defined signal 2 (POSIX). |
SIGPIPE |
13 |
Broken pipe (POSIX). |
SIGALRM |
14 |
Alarm clock (POSIX). |
SIGTERM |
15 |
Termination (ANSI). |
SIGSTKFLT |
16 |
Stack fault. |
SIGCLD |
SIGCHLD |
Same as SIGCHLD (System V). |
SIGCHLD |
17 |
Child status has changed (POSIX). |
SIGCONT |
18 |
Continue (POSIX). |
SIGSTOP |
19 |
Stop, unblockable (POSIX). |
SIGTSTP |
20 |
Keyboard stop (POSIX). |
SIGTTIN |
21 |
Background read from tty (POSIX). |
SIGTTOU |
22 |
Background write to tty (POSIX). |
SIGURG |
23 |
Urgent condition on socket (4.2 BSD). |
SIGXCPU |
24 |
CPU limit exceeded (4.2 BSD). |
SIGXFSZ |
25 |
File size limit exceeded (4.2 BSD). |
SIGVTALRM |
26 |
Virtual alarm clock (4.2 BSD). |
SIGPROF |
27 |
Profiling alarm clock (4.2 BSD). |
SIGWINCH |
28 |
Window size change (4.3 BSD, Sun). |
SIGPOLL |
SIGIO |
Pollable event occurred (System V). |
SIGIO |
29 |
I/O now possible (4.2 BSD). |
SIGPWR |
30 |
Power failure restart (System V). |
SIGSYS |
31 |
Bad system call. |
SIGUNUSED |
31 |
- |
JVM运行信息
接下来两行描述了JVM相关版本信息及运行配置信息,内容如下:
# JRE version: Java(TM) SE Runtime Environment (7.0_80-b15) (build 1.7.0_80-b15)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode linux-amd64 compressed oops)
上述文件内容可以得知以下几点:
- JRE版本号为1.7u80
- JVM版本号为24.80-b11
- JVM运行在Server模式下。对应的是Client模式,Client JVM适合需要快速启动和较小内存空间的应用,它适合交互性的应用,比如GUI;而Server JVM则是看重执行效率的应用的最佳选择,更适合服务端应用。
- JVM运行在混合模式下,即mixed mode,是JVM默认的运行模式。其他模式还有解释模式(interpreted mode)和编译模式(compiled mode),解释模式会强制JVM以解释方式执行所有的字节码,编译模式下JVM在第一次使用时会把所有的字节码编译成本地代码,这两种模式各有优劣,单独使用时都会有部分性能上的损失,所以默认使用混合模式即可,混合模式下对于字节码中多次被调用的部分,JVM会将其编译成本地代码以提高执行效率;而被调用很少(甚至只有一次)的方法在解释模式下会继续执行,从而减少编译和优化成本。
崩溃原因
接下来两行描述了引发崩溃问题的函数帧
# Problematic frame:
# V [libjvm.so+0x65395c] jni_SetByteArrayRegion+0x19c
| |
| +-- 类似于程序计数器, 以库名和偏移量表示。
| 对于与位置无关的库(JVM和其他库),可以不通过
| 调试器或通过反汇编程序转存偏移量周围结
| 构的core文件来定位引起崩溃的指令。
+----------------- 帧类型
帧类型包括以下几种:
帧类型 |
描述 |
C |
Native C frame |
j |
Interpreted Java frame |
V |
VMframe |
v |
VMgenerated stub frame |
J |
Other frame types, including compiled Java frames |
关于例子中描述的jni_SetByteArrayRegion+0x19c 这部分目前没有找到相关的资料,官方给的示例中并没有这一部分,根据字面含义来看,此部分应该表示的是崩溃时正在通过JNI方式调用SetByteArrayRegion方法。
错误信息
接下来的错误信息部分根据不同错误显示不一样的内容,在官方给的资料中提供了一份关于内部错误的错误信息,示例如下:
# An unexpected error has been detected by HotSpot Virtual Machine:
# Internal Error (4F533F4C494E55583F491418160E43505000F5), pid=10226, tid=16384
# Java VM: Java HotSpot(TM) Client VM (1.6.0-rc-b63 mixed mode)
以上示例中提供的内容没有信号名称和信号值,只包含了Internal Error 和一个十六进制的字符串,该字符串对出现问题的模块和行号进行了编码,通常情况下只对JVM工程师有用。
因为我们生产环境上出现的问题和示例中的问题种类不一样,所以我们拿到了这样一段信息:
# Core dump written. Default location: /apps/gateway/project/bin/core or core.48
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
这段信息中记录了core dump文件的位置和官方的BUG反馈页面地址,针对具体问题则需要查看core dump文件了。
线程描述
这一部分描述崩溃时正在运行的线程信息,如果有多个线程同时崩溃,只会打印其中一个线程的信息。
线程信息
Current thread (0x00007f80dc8ce000): JavaThread "RcvThread: com.*.*.*.remote.internal.RemoteTCPConnection[qmid=*,fap=10,peer=/*.*.*.9,localport=*,ssl=no]" daemon [_thread_in_native_trans, id=90,stack(0x00007f807dbb5000,0x00007f807dcb6000)]
第一部分展示了引发致命错误的线程,以上为生产的实际信息,因为敏感信息,内容中部分字段使用* 进行了脱敏。各部分说明如下:
?日志内容 |
实际含义 |
(0x0805ac88) |
指针地址 |
JavaT |
|