GC overhead limit exceeded
java.lang.OutOfMemoryError:GC overhead limit exceeded
是虚拟机判定的GC效率过低抛出的error,这个仅仅是起到辅助作用,帮助提示系统分配的堆可能太小,虚拟机不一定要开启这个错误提示,可以通过“-XX:-UseGCOverheadLimit”来禁止这种OOM的产生。
判定GC效率过低的条件
GC是内存回收的关键,如果GC效率低下,那么系统的性能会受到严重的影响。如果系统的堆空间太小,那么GC所占的时间就会较多,并且回收所释放的内存就会较少。根据GC占用的系统时间,以及释放内存的大小,虚拟机会评估GC的效率,一旦虚拟机认为GC的效率过低,就有可能直接抛出OOM异常。
虚拟机判定的GC效率过低的情况如下:
(1)花在GC上的时间是否超过了98%(2)年老代释放的内存是否小于2%(3)eden区释放的内存是否小于2%(4)是否连续最近5次GC都出现了上述几种情况(同时出现)只有同时满足上面条件,虚拟机才可能抛出OOM。