一、目标
此文目的有二:1、学习如何去获取dump文件;2、如何通过分析dump文件定位程序中发生OOM之处。
二、准备工作
1、JVM参数设置:-XX:+HeapDumpOnOutOfMemoryError,即让程序遇到OOM时自动生成一份dump文件。
2、程序很简单:
public static void main(String[] args){
List list = new ArrayList();
while (true){
list.add(2048*1024*2048);
list.add("为了撑爆内存也是没办法啦~");
}
}
3、结果:
三、结果分析(jvisualvm)
dump分析工具有很多,但是适合MAC的比较少,但是有一款JDK自带的工具非常好用:jvisualvm。
直接在Iteam输入jvisualvm即可启动该工具,启动后页面如下:
然后再入dump文件(默认在当前目录,也就是工程目录下):
文件中首先展现的是各种基本信息,然后找到关键点--堆转储上的线程信息:
从里面可以清楚的获取到发生OOM的位置:首先发生OOM的线程是主线程“main”,最外com.egov.test.DumpMain.main(DumpMain.java:16),然后具体是java.util.ArrayList.add(ArrayList.java:458)
在添加对象时内存溢出。。。一层一层往内走,最终发现是在扩容时 java.util.Arrays.copyOf(Arrays.java:3210)
发生了OOM错误。
通过分析,我门准确定位到了错误发生的地方,接下来是猿们自己改逻辑代码了。