1、 OOM 分析前提的两个文件
文本文件和 二进制文件;
2、 两个文件说明
java 程序运行时,有时会产生 javacore 及 heapdump 文件,java 程序
在遇到致命问题时,就会产生这两个文件,有时产生时,java 应用不会死掉,
还能继续运行,有时则 java 进程会死掉,即 java 进程被杀死。为了能够保留
java 应用发生致命错误前的 java 的运行状态,jvm 在死掉前产生两个文件,
分别为 javacore 及 heapdump 文件。
javacore 文件主要保存的是 java 应用各线程在某一时刻的运行的位置,即执
行到哪一个类的哪一个方法哪一个行上。javacore 是一个文本文件,打开后可
以看到每一个线程的执行栈,以 stacktrace 的方式显示。通过对 javacore 的
分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据
库查询,长期得不到响应,最终导致系统崩溃。
heapdump 文件是一个二进制文件,它保存了某一时刻 jvm 堆中对象情况,
这种文件需要相应的工具进行分析,笔者用得较多的是 heap analyzer 这个工
具。这个文件最重要的作用就是分析系统是否存在内存溢出的情况,通过
heapanalyzer 可以很简单地分析出溢出的位置。
3、 两个文件的生成方式
这两个文件也可以手工的方式生成,经常我们会遇到系统变慢或无响应的情况,
这个时候就以采用手工的方式生成 javacore 及 heapdump 文件,通过对这两
个文件的分析,查出原因进而解决问题,在 unix/linux 上,产生这两个文件的
方法是首先,ps -ef|grep java 找出 java 进程 id ,然后再执行 kill -3 进程号
的操作,等文件生成后再做一次同样的操作,再产生一组文件,两组文件在分
析 javacore 时特别有效,困为它可以看出在先后两个时间点上,线程执行的
位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能
有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点耗时是