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

线程阻塞

CPU 使用率过高

JVM Crash

堆内存不足

类装载

Java虚拟机自身的Bug

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

内存溢出

二、日志文件

hs_err_pid.log,致命错误出现的时候,JVM生成了hs_err_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文件的分析,我们得到内存的可能泄露点有两个,都是占用了比较大的内存,通过分析内存泄露点来找到解决办法。

<!--EndFragment-->
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐