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