java.lang.OutOfMemoryError:GC overhead limit exceeded

情景:线上服务突然宕机,检查日志发现只有这个异常会导致。

分析:线上没有死循环程序,不知道什么原因造成GC问题,最后解决办法是增大了服务的运行内存

第二天分析gc的原因

  异常对性能不利。抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
  ‘GC overhead limit exceeded’官方解释:‘并行/并发回收器在GC回收时间过长时会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。用来避免内存过小造成应用不能正常工作。’  
  应该是程序异常太多,不停触发GC的预测策略,加速了OOM的出现。
下面这篇博文可做参考:https://blog.csdn.net/casablancaagnes_3sdf/article/details/52299100
原文地址:https://www.cnblogs.com/zzt-lovelinlin/p/12886282.html