请描述Java虚拟机中G1垃圾回收器的完整回收流程,包括其分代与分区结构、对象从新生代晋升至老年代的路径,以及混合回收阶段如何选择并处理CSet(收集集合)中的分区。
考察说明
考察对G1垃圾回收器内部机制、分区布局及混合回收流程的理解深度。
回答思路
- 【回答框架 1】G1将堆划分为多个等尺寸的Region,每个Region可独立扮演Eden、Survivor或Old角色,逻辑上仍分代,但物理上不连续。其核心流程分为Young GC和Mixed GC:Young GC只回收Eden和Survivor区,将存活对象复制到新的Survivor或晋升到Old区;当老年代占用达到IHOP阈值后触发Mixed GC。
- 【回答框架 2】Mixed GC是G1的核心,流程包括初始标记、并发标记、最终标记和筛选回收四步。初始标记短暂STW,标记根对象;并发标记与应用并发执行,遍历对象图标记存活对象,并记录引用变更;最终标记处理SATB缓冲区完成标记;筛选回收根据各Region的回收价值(回收获得空间与停顿时间之比)选择CSet,并将存活对象复制到其他Region。
- 【回答框架 3】G1通过Remembered Set(RSet)追踪跨Region引用,避免全堆扫描。在回收时,通过RSet能找到被外部引用的对象,保证正确性。对象晋升方式有两种:1)存活对象年龄达到阈值;2)Survivor空间不足,直接溢出到Old区。晋升对象可能形成大对象,大对象直接分配到Humongous区域。
- 【回答框架 4】G1的停顿预测模型基于历史数据估算各Region回收时间,通过调整回收Region数量来满足期望停顿时间目标。最终目标是尽量多地回收空间,同时控制停顿在可接受范围内。其完整流程是增量式的,不是一次全堆回收,因此能实现可预测停顿。
- 【关键点 1】G1将堆划分为大小相等的Region,逻辑分代但物理不连续。
- 【关键点 2】回收流程分为Young GC和Mixed GC,后者包含初始标记、并发标记、最终标记、筛选回收四个阶段。
- 【关键点 3】CSet选择基于回收价值排序,结合停顿预测模型控制停顿时间。
- 【关键点 4】RSet用于管理跨Region引用,是G1正确回收的关键数据结构。
- 【关键点 5】对象晋升包括年龄阈值和Survivor空间满两种情况,大对象直接进入Humongous区。
- 【易错点 1】不能将G1的并发标记与CMS的并发标记完全等同,G1在并发阶段使用SATB方式记录变化,整体停顿控制更精细。
- 【易错点 2】Mixed GC不是每次都回收所有Old区,而是按优先级选择回收价值高的Region,误认为回收全堆是常见误区。
- 【易错点 3】晋升失败时G1会触发Full GC,这是退化路径,不代表正常流程,因此不能说G1从不发生Full GC。