JVM崩溃时产生的文件 hs_err.pid.log
hs_err.pid.log
hs_err.pid.log:当jvm崩溃时,会生成一个hs_err_pid.log文件,并且把它存放到程序目录下,可以通过该文件来定位导致jvm崩溃的原因。
jvm崩溃,是由jvm自身的bug或者本地方法执行错误引起的,本地方法就是被native修饰的方法。
要注意:
-
内存溢出通常不会导致jvm崩溃
-
纯粹的java代码通常不会导致jvm崩溃,不过也有例外,比如Unsafe类,它可以直接操作内存,如果操作不当,也会导致jvm崩溃。
案例:这段代码中使用Unsafe类访问了非法内存地址,这种内存操作将导致jvm崩溃
public static void main(String[] args) throws Exception {
// 通过反射获取Unsafe实例
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
// 尝试向受保护的0地址写入数据,触发操作系统级别的内存保护异常,
// JVM无法处理这种致命错误,直接崩溃退出,崩溃日志位置取决于JVM工作目录
unsafe.putAddress(0, 0xBAD); // 这将导致访问违例
}
生成的文件:
文件内容讲解
第一部分:jvm基础信息,简述了jvm崩溃的原因,还包括一些版本和配置信息
内容讲解:
-
SIGSEGV 是信号量:
- SIGSEGV:表示jvm崩溃时正在执行JNI(java native interface)的代码
- EXCEPTION_ACCESS_VIOLATION:表示jvm崩溃是正在执行jvm自身的代码
- EXCEPTION_STACK_OVERFLOW:表示jvm崩溃是栈溢出导致的错误,这往往是应用程序中存在深层递归导致的
-
pc:程序计数器的值
-
pid:进程号
-
tid:线程号
-
Problamatic frame:问题帧
- C:帧类型为本地帧
- j:java帧
- V:虚拟机帧
- v:虚拟机生成的存根栈帧
- J:其它类型的帧,包括编译后的java帧
第二部分:thread,线程信息,描述了程序崩溃时正在执行的线程,可以看到线程的栈信息
内容讲解:
- 线程类型:
- JavaThread:java线程
- VMThread:jvm的内部线程
第三部分:process,进程信息 // 内容最多
第四部分:system:系统信息