Concurrent Mark Sweep,并发标记清除
- 初始标记
- 并发标记
- 预清理(可关闭)
- 并发清理
- 并发重置
CMS是一个关注停顿的垃圾回收器。同时CMS回收器在部分工作流程中,可以与用户程序同时运行,从而减少应用程序的停顿时间。
-
CPU资源敏感: 当CPU资源比较紧张时,应用系统的性能在垃圾回收可能会很糟糕
-
无法处理浮动垃圾: 并发清楚阶段用户线程还在运行,就会有新的垃圾产生,这一部分垃圾没有被标记,在本次GC中无法处理,只能等到下一次再处理。CMS垃圾收集阶段用户程序还要运行,所以他需要预留出一部分内存空间给用户线程使用,就不能跟其他收集器一样等到老年代快满了才收集。如果CMS运行期间内存不够了就会出现
Concurrent Mode Failure
,这时虚拟机将使后备预案,使用老年代串行回收器进行垃圾回收,此时应用程序将完全中断,直至回收完成。 -
大量空间碎片产生: 这个是使用标记清除法引起的问题。针对这个问题CMS提供了两个参数:
-
-XX:+UseCMSCompactAtFullCollection
:FullGc后对内存进行压缩整理;·
-
-XX:CMSFullGCsBeforeCompaction=x
:执行x次不压缩的FullGc后执行一次压缩的。
相关配置参数
// 启用CMS回收器
-XX:+UseConcMarkSweepGC
// 关闭预清理
-XX:-CMSPrecleaningEnabled
// 在CMS GC前启动一次ygc
-XX:+CMSScavengeBeforeRemark
// 并发下线程数设置
-XX:ConcGCThreads
-XX:ParallelGCThreads
// 垃圾收集完成后进行一次内存清理
-XX:+UseCMSCompactAtFullCollection
// 设置在执行多少次Full GC后对内存空间进行压缩整理。
-XX:CMSFullGCsBeforeCompaction
// 指定老年代空间使用率达到多少时进行一次CMS垃圾回收
-XX:CMSInitiatingOccupancyFraction=68
// 使用上面参数指定的回收阈值,JVM仅在第一次使用设定值,后续则会根据运行时采集的数据做自动调整
-XX:+UseCMSInitiatingOccupancyOnly
// 开启Perm区回收功能
-XX:+CMSClassUnloadingEnabled