1、可以引发JVM崩溃的常见缘由有:linux
线程阻塞数据库
CPU 使用率太高服务器
JVM Crash工具
堆内存不足google
类装载spa
Java虚拟机自身的Bug操作系统
JDK与服务器(CPU、内存、操做系统)的兼容性.net
内存溢出插件
2、日志文件
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堆中对象使用状况,这种文件须要相应的工具进行分析。这类文件最重要的做用就是分析系统中是否存在内存溢出的状况。
3、宕机分析
宕机的时候一定会产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文件的分析,咱们获得内存的可能泄露点有两个,都是占用了比较大的内存,经过分析内存泄露点来找到解决办法。