美文网首页
OOM之GC overhead limit exceeded

OOM之GC overhead limit exceeded

作者: Shaw_Young | 来源:发表于2020-07-23 01:20 被阅读0次

    GC回收时间过长时会抛出OutOfMemoryError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存,连续多次GC都只回收了不到2%的极端情况下才会抛出。加入不抛出GC overhead limit 错误会发生什么情况呢?
    那就是GC清理的这么点内存很快会再次填完,迫使GC再次执行,这样就形成了恶性循环,CPU使用率一直是100%,而GC没有任何成果。

    -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m

    public class GCOverheadDemo {
    
        public static void main(String[] args) {
            int i = 0;
            List<String> list = new ArrayList<>();
            try {
                while (true) {
                    list.add(String.valueOf(++i).intern());
                }
            } catch (Throwable e) {
                System.out.println("************i: " + i);
                e.printStackTrace();
                throw e;
            }
        }
    
    }
    
    java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.lang.Integer.toString(Integer.java:401)
        at java.lang.String.valueOf(String.java:3099)
        at com.young.java.GCOverheadDemo.main(GCOverheadDemo.java:17)
    Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.lang.Integer.toString(Integer.java:401)
        at java.lang.String.valueOf(String.java:3099)
        at com.young.java.GCOverheadDemo.main(GCOverheadDemo.java:17)
    

    相关文章

      网友评论

          本文标题:OOM之GC overhead limit exceeded

          本文链接:https://www.haomeiwen.com/subject/awrflktx.html