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); } } }
我刻意的制造了一段會溢出的代碼。
首先你可能需要改一下mat的配置文件。
通過下圖的leak suspects分析是可以看出gc root的。比較代碼和圖中的b a。
還有其他的方式可以分析,點擊dominator tree可以獲取到持有大對象的線程,然后在其上也可以執行gcroot的分析,如下圖。
最后說的話,
實際情況沒有這么清晰的。你可能需要把gc root路徑上的每一個都點一點來尋找到底哪里發生了問題。