Java虚拟机宕机分析-虚拟机文件

一、能够引起JVM崩溃的常见原因有:

  1. 线程阻塞

  2. CPU 使用率过高

  3. JVM Crash

  4. 堆内存不足

  5. 类装载

  6. Java虚拟机自身的Bug

  7. JDK与服务器(CPU、内存、操作系统)的兼容性

  8. 内存溢出

二、日志文件

hs_err_pid.log,致命错误出现的时候,JVM生成了hs_err_pid<pid>.log这样的文件,其中包含了虚拟机崩溃原因的重要信息:

  • 触发致命错误的操作异常或者信号;

  • 版本和配置信息;

  • 触发致命异常的线程详细信息和线程栈;

  • 当前运行的线程列表和它们的状态;

  • 堆的总括信息;

  • 加载的本地库;

  • 命令行参数;

  • 环境变量;

  • 操作系统CPU的详细信息。

JavaCore及HeapDump文件,Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下。有时致命问题发生后,Jvm不会死掉,还能继续运行,但致命问题发生,Jvm进程会死掉,为了能够保留Java应用发生致命错误前的运行状态,JVM在宕掉前产生两个文件,分别为JavaCore及HeapDump文件。

JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。

HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。

三、宕机分析

宕机的时候必定会产JavaCore及HeapDump文件,如果未宕机时,想查看Jvm中线程与内存情况,那么在linux下可通过kill -3 进程号来手工产生这两个文件来进行分析。

MAT

Eclipse Memory Analyzer是一个非常好用的分析工具,我们可以利用它的Eclipse 插件轻松实现查看对象树、对象大小、生成报告,甚至自动化分析可能出现泄露的对象, 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和现有的开发平台集成。

JavaCore文件的头部有一个“Current Thread Details”标记,它记录了JavaCore产生时系统运行的线程id,使用线程id在文件中查找线程的详细信息,该信息中记载了线程运行哪个类的时候造成的JavaCore。

HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。MAT工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

示例:

javacore文件分析:

Java虚拟机宕机分析

由上图可见,引起javacore的原因是因为内存溢出,但其进程中的线程并未出现明细的异常,见

下图的线程状态分析。

Java虚拟机宕机分析

引起javacore的线程如下所示:

Java虚拟机宕机分析

该线程异常如下:

Java虚拟机宕机分析

由此可见,因为内存不足导致了内存溢出,程序不存在异常,那么接下来通过分析dump来查看内存情况,见下图:

Java虚拟机宕机分析

Java虚拟机宕机分析

通过上述的dump文件的分析,我们得到内存的可能泄露点有两个,都是占用了比较大的内存,通过分析内存泄露点来找到解决办法。

推荐阅读