G1垃圾收集器工作原理与CMS区别

一、文章概述

G1(Garbage-First)是JDK9默认的垃圾收集器,全面取代CMS。它打破了传统分代收集的物理限制,采用Region分区设计,兼顾吞吐量与低延迟,支持用户设置最大停顿时间。本文讲解G1核心工作原理,并通过表格对比其与CMS的关键差异。

二、G1核心工作原理

G1将整个Java堆划分为多个大小相等的Region(默认2048个),每个Region可动态作为Eden、Survivor、老年代或大对象区(Humongous)。其核心思想是优先回收垃圾最多的Region,在有限时间内获得最高回收效率。

G1核心收集流程(STW阶段已加粗)

**初始标记 STW**

并发标记

**最终标记 STW**

**筛选回收 STW**

阶段说明

  1. 初始标记:标记GC Roots直接关联对象,停顿极短
  2. 并发标记:与用户线程并行,遍历堆标记存活对象
  3. 最终标记:修正并发阶段的引用变动,短暂停顿
  4. 筛选回收:G1特有阶段,根据用户设置的停顿时间,优先回收垃圾最多的Region,采用复制算法整理内存

三、G1与CMS核心区别

对比维度 G1收集器 CMS收集器
底层结构 整堆Region分区 物理分代(年轻代+老年代)
收集范围 整堆收集 仅老年代收集
核心算法 标记-复制+标记-整理 标记-清除
内存碎片 无碎片(复制整理) 大量内存碎片
停顿控制 支持设置最大停顿时间 无法预测停顿时间
大对象处理 专门Humongous区 直接进入老年代
适用场景 大堆、低延迟、高吞吐量 中小堆、纯低延迟场景

总结

G1通过Region分区和优先回收策略,从根本上解决了CMS的内存碎片问题,实现了可预测的低延迟。它兼顾了吞吐量和响应时间,是现代JVM的首选收集器;而CMS作为经典的并发收集器,其设计思想为G1等新一代收集器奠定了基础。

更多推荐