注:这篇文章只是一个手册,用来供你做实验时照抄。没有任何原理性的东西,没有干货。
如何做出一个OutOfMemoryError并获取dump文件?
第一步: 设置jvm参数
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/kent/temp/jvm-oom.prof
第二步:使代码产生jvm异常
1. 经验表明,显式地throw new OutOfMemoryError()不会产生dump文件
2. 简单的做法:通过String的串接
String s = "abc"; while(true) s += s;
3. 因String导致OOM的情况在实际上并不常发生。可以用自定义对象搞出OOM,然后用visual vm打开dump文件,以加深感性认识:
public static void main(String[] args) { List<ScapeGoat> goats = new ArrayList<ScapeGoat>(); goats.add(new ScapeGoat()); // 让ScopeGoat对象数呈指数级增长(2的n次方) while (true) { int goatsNum = goats.size(); for (int i = 0; i < goatsNum; i++) { goats.add(new ScapeGoat()); } System.out.println("Now we have number of goats: " + goats.size()); } } private static final class ScapeGoat { }
看下visual vm的分析:
注意事项
1.最好不要直接在eclipse里运行能产生oom的代码,否则会导致eclipse假死、没反应