JVM崩溃时产生的文件 hs_err.pid.log

发布于:2025-03-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

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:系统信息