JAVA面试-JVM篇 02-G1垃圾收集器的工作原理是什么与CMS的区别
·
G1垃圾收集器工作原理与CMS区别
一、文章概述
G1(Garbage-First)是JDK9默认的垃圾收集器,全面取代CMS。它打破了传统分代收集的物理限制,采用Region分区设计,兼顾吞吐量与低延迟,支持用户设置最大停顿时间。本文讲解G1核心工作原理,并通过表格对比其与CMS的关键差异。
二、G1核心工作原理
G1将整个Java堆划分为多个大小相等的Region(默认2048个),每个Region可动态作为Eden、Survivor、老年代或大对象区(Humongous)。其核心思想是优先回收垃圾最多的Region,在有限时间内获得最高回收效率。
G1核心收集流程(STW阶段已加粗)
阶段说明:
- 初始标记:标记GC Roots直接关联对象,停顿极短
- 并发标记:与用户线程并行,遍历堆标记存活对象
- 最终标记:修正并发阶段的引用变动,短暂停顿
- 筛选回收:G1特有阶段,根据用户设置的停顿时间,优先回收垃圾最多的Region,采用复制算法整理内存
三、G1与CMS核心区别
| 对比维度 | G1收集器 | CMS收集器 |
|---|---|---|
| 底层结构 | 整堆Region分区 | 物理分代(年轻代+老年代) |
| 收集范围 | 整堆收集 | 仅老年代收集 |
| 核心算法 | 标记-复制+标记-整理 | 标记-清除 |
| 内存碎片 | 无碎片(复制整理) | 大量内存碎片 |
| 停顿控制 | 支持设置最大停顿时间 | 无法预测停顿时间 |
| 大对象处理 | 专门Humongous区 | 直接进入老年代 |
| 适用场景 | 大堆、低延迟、高吞吐量 | 中小堆、纯低延迟场景 |
总结
G1通过Region分区和优先回收策略,从根本上解决了CMS的内存碎片问题,实现了可预测的低延迟。它兼顾了吞吐量和响应时间,是现代JVM的首选收集器;而CMS作为经典的并发收集器,其设计思想为G1等新一代收集器奠定了基础。
更多推荐

所有评论(0)