JVM致命错误日志(hs_err_pid.log)分析

崩溃文件输出

最近两天测试环境有一个服务总是会挂(两到三天一次),JVM虚拟机总是会崩溃。所以有必要了解JVM崩溃的原因是什么。

当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定。

默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM 参数指定生成路径:

-XX:ErrorFile=/var/log/hs_err_pid.log

这个文件主要包含如下内容:

  • 日志头文件
  • 导致 crash 的线程信息
  • 所有线程信息
  • 安全点和锁信息
  • 堆信息
  • 本地代码缓存
  • 编译事件
  • gc 相关记录
  • jvm 内存映射
  • jvm 启动参数
  • 服务器信息
  • 下面就根据这个文件内容逐步解析。

下载分析工具进行查看

CrashAnalysis 简介
CrashAnalysis 是一款诊断工具。是某APM项目组成员编写,里面把常见的问题分类并且给出解决方案或者方向,帮助我们定位问题。 下面是这款工具的 github 地址:

https://www.aboutyun.com/blog-3890-4388.html

使用教程
CrashAnalysis 使用起来非常的简单和人性化。通过执行jar命令,把log作为参数输入 java -jar CrashAnalysis-1.0-SNAPSHOT.jar ${hs_err_pid.log}

java -jar CrashAnalysis-1.0-SNAPSHOT.jar ${hs_err_pid.log}

CrashAnalysis-1.0-SNAPSHOT.jar 这个文件在上面的仓库中有一个打包好的,大家可以直接下载使用。是不是用起来比较自己看 hs_err_pid.log 文件简单多了。

默认的它是用 jdk 1.8 编译的,如果你的 jdk 版本过低,建议自己下载代码,自己编译这个 jar 文件。

诊断效果
执行完,上面的命令后,会有诊断信息的 tab 页,里面会告诉我们分析结果。 例如下面的报告:

这是一个解释器的问题,就是jvm把字节码转化成机器码出错了。 引起这种情况的原因有很多,一般都是jdk的bug 可以更换不同的jvm模式 例如-XInt,纯解释模式 在运行过程信息中有编译情况,可以查看具体编译到谁出错了 可以通过排除编译这些类来试试

参考链接:
JVM致命错误日志(hs_err_pid.log)分析-CSDN博客

你可能感兴趣的:(java,jvm)