java.lang.OutOfMemoryError:GC overhead limit exceeded错误

java主要有3种比较常见的OutOfMemory Error:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError:PermGen space
  • java.lang.OutOfMemoryError: GC overhead limit exceeded

今天遇到了GC overhead limit exceeded这个错误:

        这个错误会出现在这个场景中:GC占用了多余98%(默认值)的CPU时间却只回收了少于2%(默认值)的堆空间。示意图如下:

java.lang.OutOfMemoryError:GC overhead limit exceeded错误_第1张图片

        这个错误其实就是空闲内存与GC之间平衡的一个限制,当经过几次GC之后,只有少于2%的内存被释放,也就是很少的空闲内存,可能会再次被快速填充,这样就会触发再一次的GC。目的是为了让应用终止,给开发者机会去诊断问题。一般是应用程序在有限的内存上创建了大量的临时对象或者弱引用对象,从而导致该异常。虽然加大内存可以暂时解决这个问题,但是还是强烈建议去优化代码,或者更加有效。

解决办法:

1、JVM给出一个参数避免这个错误:-XX:-UseGCOverheadLimit。但是,这个参数并不是解决了内存不足的问题,只是将错误发生时间延后,并且替换成java.lang.OutOfMemoryError: Java heap space。

2、增加堆内存,在大多数情况下, 增加堆内存并不能解决问题。例如程序中存在内存泄漏, 增加堆内存只能推迟产生 java.lang.OutOfMemoryError: Java heap space 错误的时间。当然, 增大堆内存, 还有可能会增加 GC pauses 的时间, 从而影响程序的 吞吐量或延迟。

3、终极方法就是找到占用内存大的地方,优化代码。

参考:

https://www.cnblogs.com/penghongwei/p/3603326.html

https://blog.csdn.net/liuxinghao/article/details/77934725

https://blog.csdn.net/renfufei/article/details/77585294

你可能感兴趣的:(jvm)