CMS-GC触发条件总结

785 阅读1分钟

一、cms gc触发的类型有两种

 1、foreground collector

 2、background collector

二、foreground触发条件

当对象分配空间不足,就会触发gc。使用的算法是标记交换(mark sweep),不进行压缩处理。

三、background触发条件

执行流程:cms有一个单独的线程去定时(默认每隔2S)扫描,判断是否满足触发background collector的条件,如果满足则进行回收。

分5种触发条件

情况一:并行fullgc

情况二:根据统计数据动态计算

仅未配置UseCMSInitiatingOccupancyOnly 时使用,此时会根据统计数据动态判断是否需要进行一次 CMS GC。

统计逻辑:如果预测 CMS GC完成所需要的时间大于预计的老年代将要填满的时间,则进行 GC。

情况三:根据old gen情况判断

1、Old Gen 空间使用占比情况与阈值比较,如果大于阈值则进行 CMS GC,默认92%。阈值参数CMSInitiatingOccupancyFraction 

2、UseCMSInitiatingOccupancyOnly

1)对象成功分配扩容引起的gc

2)根据cms gc空闲链判断

情况四:根据增量gc是否可能会失败

新生代和老年代的GC体系中,主要指的是 Young GC 是否会失败。如果 Young GC 已经失败或者可能会失败,JVM 就认为需要进行一次CMS GC。(悲观策略)

情况五:根据meta space情况判断

CMSClassUnloadingEnabled 参数时,会进行设置。这种情况下就会进行一次 CMS GC。因此经常会有应用启动不久,Old Gen 空间占比还很小的情况下,进行了一次 CMS GC,让你很莫名其妙,其实就是这个原因导致的。