一、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,让你很莫名其妙,其实就是这个原因导致的。