CMS收集器和G1收集器优缺点

admin 102 0
CMS收集器以并发标记清除为核心,优势在于并发执行(用户线程与收集线程大部分时间并行),停顿时间短,适合响应敏感场景;但缺点显著:内存碎片化严重(需Full GC整理),可能因并发失败触发STW,回收效率随内存增大下降,G1收集器采用Region划分与可预测停顿模型,优势是能建立停顿时间目标,有效控制GC延迟,内存碎片化问题小;缺点是内存占用较高(保留Region作为空闲),小内存场景下效率不及CMS,且实现复杂度更高。

CMS与G1垃圾收集器:核心特性、优缺点及场景选择

在Java虚拟机(JVM)的内存管理中,垃圾收集器(Garbage Collector, GC)的性能直接影响应用的响应速度、吞吐量和稳定性,作为JVM发展历程中的两个重要里程碑,CMS(Concurrent Mark Sweep)收集器和G1(Garbage-First)收集器曾广泛应用于生产环境,二者在设计理念、运行机制和适用场景上存在显著差异,本文将深入分析两者的核心特性、优缺点,为JVM调优提供参考。

CMS收集器:低停顿优先的“并发清扫者”

核心设计目标与运行机制

CMS(Concurrent Mark Sweep)是一款以“获取最短回收停顿时间”为目标的垃圾收集器,主要针对老年代回收,搭配新生代的ParNew收集器组成“ParNew+CMS”组合,其核心是通过并发执行减少STW(Stop-The-World,全局停顿)时间,运作过程分为四个阶段:

  • 初始标记(Initial Mark):STW阶段,仅标记GC Roots直接关联的对象,速度快(停顿时间短)。
  • 并发标记(Concurrent Mark):与用户线程并发执行,遍历对象图,标记所有可达对象(耗时较长,但无停顿)。
  • 重新标记(Remark):STW阶段,修正并发标记期间因用户线程运行导致变动的对象(“增量更新”技术),停顿时间比初始标记稍长。
  • 并发清除(Concurrent Sweep):与用户线程并发执行,清除未被标记的垃圾对象(即“不可达对象”)。

优点

  • 低停顿时间:并发阶段(标记、清除)与用户线程并行,大幅减少老年代回收时的STW时间,尤其对响应时间敏感的应用(如Web服务、在线交易系统)友好。
  • 吞吐量影响较小:除初始标记和重新标记外,大部分回收工作不阻塞用户线程,对应用吞吐量的损耗低于Serial Old、Parallel Old等“全STW”收集器。
  • 成熟稳定:作为JVM早期支持的并发收集器,CMS在JDK 7/8中广泛使用,调优经验丰富,参数配置相对简单(如-XX:+UseConcMarkSweepGC启用)。

缺点

  • 内存碎片问题:基于“标记-清除”算法,回收后内存

标签: #并发回收 #停顿控制