一、能够引起JVM崩溃的常见原因有:
线程阻塞
CPU 使用率过高
JVM Crash
堆内存不足
类装载
Java虚拟机自身的Bug
JDK与服务器(CPU、内存、操作系统)的兼容性
内存溢出
二、日志文件
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文件分析:
由上图可见,引起javacore的原因是因为内存溢出,但其进程中的线程并未出现明细的异常,见
下图的线程状态分析。
引起javacore的线程如下所示:
该线程异常如下:
由此可见,因为内存不足导致了内存溢出,程序不存在异常,那么接下来通过分析dump来查看内存情况,见下图:
通过上述的dump文件的分析,我们得到内存的可能泄露点有两个,都是占用了比较大的内存,通过分析内存泄露点来找到解决办法。