天天看点

java.lang.OutOfMemoryError: GC overhead limit exceeded 异常解决产生原因

产生原因

GC回收时间过长时会抛出OutOfMemroyError,过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存,连续多次GC 都只回收了不到2%的极端情况下才会抛出(最起码已经进行了5次连续的垃圾回收)。

解决方法

1、增加heap堆内存

2、一般出现这种问题跟内存其实没太大关系,主要还是代码问题,代码中出现了大量占用内存的对象,一定要检查代码,下面我们来代码演示。

代码演示

演示JVM参数配置

-Xms20m -Xmx20m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m

第一步

java.lang.OutOfMemoryError: GC overhead limit exceeded 异常解决产生原因

第二步

java.lang.OutOfMemoryError: GC overhead limit exceeded 异常解决产生原因

第三步

import java.util.ArrayList;
import java.util.List;

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 异常解决产生原因