虚拟机使用的是HotSpot8(jdk8)
使用idea进行编码
建立灿三个测试类
Main类:
import java.awt.*;
import java.util.ArrayList;
/**
* @author jiezhou
* @CalssName: Main
* @Package PACKAGE_NAME
* @Description: OOM异常排查测试
* @date 2020/7/13/14:33
*/
public class Main {
public static void main(String[] args) {
ArrayList<A> list = new ArrayList<>();
OOMObject.getC();
}
static class OOMObject{
public static void getC(){
C.c();
}
}
}
A类:
/**
* @author jiezhou
* @CalssName: A
* @Package PACKAGE_NAME
* @Description:
* @date 2020/7/13/14:59
*/
public class A {
int a=22;
}
C类
import java.util.ArrayList;
import java.util.List;
/**
* @author jiezhou
* @CalssName: C
* @Package PACKAGE_NAME
* @Description:
* @date 2020/7/13/15:03
*/
public class C {
public static void c(){
List<A> ls=new ArrayList<>();
while (true){
ls.add(new A());
}
}
}
运行main方法之前先干件事,设置一下jvm参数生成hprof文件:
添加红色标出的部分jvm参数
参数如下:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\DumpFile\
设置完成之后运行程序:
有这段输出就代表已经生成了hprof文件,
现在就该分析此文件了,我这里之前安装了JProfiler
可自行安装其他工具啦分析,我这里就使用JProfiler来分析
点击hprof文件使用JProfiler来打开,如图
可以一眼看出就是A类对象造成的OOM了,
双击A类,
选择 Incoming references
到这里我们就可以看见是C.c() line16 出现的,我们就定位到了发生oom的地方了,如有bug,请不吝赐教,抱拳抱拳~~~