OutOfMemoryError:GC overhead limit exceeded

今天上线系统后,发现java进程疯狂占用CPU资源,达到百分之六、七百,直接导致服务无法响应请求。但是查看mysql的服务,并没有出现死锁的情况,推测是Java代码里面有问题。
过了一段时间就爆出GC overhead limit exceeded的错误,也就是说程序耗尽了所有可用的内存,GC也清理不了
默认情况下, 如果GC花费的时间超过 98%, 并且GC回收的内存少于 2%, JVM就会抛出这个错误。

注意, java.lang.OutOfMemoryError: GC overhead limit exceeded 错误只在连续多次 GC 都只回收了不到2%的极端情况下才会抛出。假如不抛出 GC overhead limit 错误会发生什么情况呢? 那就是GC清理的这么点内存很快会再次填满, 迫使GC再次执行. 这样就形成恶性循环, CPU使用率一直是100%, 而GC却没有任何成果. 系统用户就会看到系统卡死 - 以前只需要几毫秒的操作, 现在需要好几分钟才能完成。

原文地址:https://www.cnblogs.com/mrnx2004/p/12163561.html