cms收集器与g1收集器的特点

admin 104 0
CMS收集器与G1收集器均为Java低停顿垃圾收集器,CMS基于标记-清除算法,分初始标记、并发标记、重新标记、并发清除四阶段,并发执行度高,停顿时间短,但会产生内存碎片,可能触发Concurrent Mode Failure,且对CPU敏感,G1面向大内存堆,将堆划分为Region,通过预测停顿模型优先回收价值最大Region,采用标记-整理算法减少碎片,兼顾吞吐量与低停顿,支持可配置的最大停顿时间,适合大内存场景,是CMS的替代方案。

CMS与G1收集器:JVM垃圾回收的演进与特性剖析

在Java虚拟机(JVM)的运行体系中,垃圾回收(Garbage Collection, GC)作为自动内存管理的核心机制,其性能直接决定了应用的响应速度与吞吐量表现,随着Java版本的持续迭代,垃圾回收器不断进化,其中CMS(Concurrent Mark Sweep)与G1(Garbage-First)堪称两个具有里程碑意义的收集器:前者开启了并发回收的先河,后者则在大内存场景下实现了停顿时间的可预测控制,本文将深入剖析两者的核心设计理念、工作原理及适用场景,揭示JVM内存管理的演进逻辑。

CMS收集器:以“低停顿”为目标的并发标记清除

CMS是JVM历史上第一款真正意义上的并发收集器,诞生于JDK 1.4时代,其设计初衷是最大限度缩短垃圾回收过程中的停顿时间,特别适合对响应时间敏感的应用场景(如Web服务、在线交易系统),其核心特点围绕“并发执行”与“标记-清除”算法展开,通过与用户线程的并行工作,显著降低了GC对应用性能的干扰。

核心工作原理:四阶段并发执行流程

CMS基于经典的“标记-清除”(Mark-Sweep)算法,工作流程划分为四个阶段,其中两个阶段可与用户线程并发执行,从而大幅减少STW(Stop The World)时间:

  • 初始标记(Initial Mark)
    仅标记与GC Roots直接关联的对象,需触发STW,但仅处理GC Roots可达的“一级关联”对象,耗时极短(通常几毫秒),对应用影响可忽略不计。

  • 并发标记(Concurrent Mark)
    与用户线程并发执行,遍历对象图标记所有存活对象,这是最耗时的阶段,但全程无需暂停用户线程,是CMS实现“低停顿”的核心保障。

  • 重新标记(Remark)
    STW阶段,主要任务是修正并发标记期间因用户线程运行导致变动的对象引用(如新对象分配、引用修改等),耗时略长于初始标记,但远低于串行标记阶段。

  • 并发清除(Concurrent Sweep)
    与用户线程并发执行,直接清除未被标记的垃圾对象,此阶段无需移动对象,仅回收内存空间,但会不可避免地产生内存碎片。

核心特点与优势

  • 并发执行,低停顿
    并发标记与清除阶段与用户线程并行,仅初始标记和重新标记需短暂停顿,整体GC停顿时间显著短于串行收集器(如Serial Old、Parallel Old),特别适合实时性要求高的场景。
  • 基于标记-清除算法
    回收过程中无需移动存活对象,避免了用户线程等待对象复制的开销,适合“响应优先”的应用模式。

局限性与缺陷

  • 内存碎片问题突出
    标记-清除算法会产生大量不连续的内存碎片,当碎片过多时,即使堆内存仍有剩余,也可能因无法分配大对象而触发“Concurrent Mode Failure”,此时JVM会退化为Serial Old进行串行回收,导致停顿时间急剧增加。
  • 对CPU资源敏感
    并发阶段会占用部分CPU资源,在CPU资源紧张的场景下,可能与应用线程竞争资源,导致整体吞吐量下降。
  • 无法处理“浮动垃圾”
    并发清除期间,用户线程可能持续生成新的垃圾对象(称为“浮动垃圾”),这些垃圾只能在下次GC时回收,若浮动垃圾生成速度过快,可能提前触发Full GC,加剧停顿问题。

G1收集器:面向大内存的“可预测停顿”回收器

随着Java应用向大内存(如4GB以上)场景扩展,CMS的碎片化问题、高并发资源占用及Full GC风险逐渐暴露,G1(Garbage-First)在JDK 7中首次引入,并在JDK 9成为默认收集器,其设计目标是兼顾吞吐量与停顿时间控制,适用于大内存服务器与多核CPU环境,核心创新在于“Region分区”与“可预测停顿模型”,彻底解决了CMS的碎片化痛点。

核心设计理念:Region分区与优先级回收

G1打破了CMS物理分代(新生代/老年代连续内存)的限制,将整个堆内存划分为多个大小相等(通常1MB-32MB,可通过-XX:RegionSize参数调整)的独立Region,每个Region根据需要动态扮演Eden、Survivor或Old角色,并通过“Remembered Set”(记忆集)记录跨Region的引用关系,避免全堆扫描,大幅提升回收效率。

核心工作原理:并发标记+混合回收

G1的工作流程分为三个主要阶段,核心是“并发标记”与“混合回收”(Mixed GC):