如何做出一个OutOfMemoryError并使它产生dump文件?

注:这篇文章只是一个手册,用来供你做实验时照抄。没有任何原理性的东西,没有干货。

如何做出一个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假死、没反应

 

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.