public class OOM {
private static List<Byte[]> list = new ArrayList<Byte[]>();
public static void main(String[] args) {
Zip zip = new Zip();
zip.test(list);
}
}
public class Zip {
private List<Byte[]> a = null;
public List<Byte[]> getA() {
return a;
}
public void setA(List<Byte[]> a) {
this.a = a;
}
public void test(List<Byte[]> list){
Zip n = new Zip();
n.setA(list);
R r = new R();
r.test1(n);
}
}
public class R {
public void test1(Zip z){
while(true){
Byte[] b = new Byte[100000];
z.getA().add(b);
}
}
}
我刻意的制造了一段会溢出的代码。
通过下图的leak suspects分析是可以看出gc root的。比较代码和图中的b a。

还有其他的方式可以分析,点击dominator tree可以获取到持有大对象的线程,然后在其上也可以执行gcroot的分析,如下图。


最后说的话,
实际情况没有这么清晰的。你可能需要把gc root路径上的每一个都点一点来寻找到底哪里发生了问题。
来源:https://www.cnblogs.com/coolgame/p/12157954.html