一、Region(堆分区)
定义 :Region是G1垃圾回收器中内存管理的最小单元,将传统连续堆划分为多个独立区域(默认2048个),每个大小在1MB-32MB之间,支持动态调整。
核心特性:
- 分区类型
- 新生代Region:包含Eden和Survivor区,占堆总空间的5%-60%。
- 老年代Region:存放长期存活对象,物理上无需与新生代连续。
- 大对象Region(HHR):存储超过Region容量50%的大对象,通过连续多个Region存放。
- 优化设计
- 动态调整:根据堆大小自动计算Region尺寸(如32GB堆对应16MB/Region)。
- 效率平衡:过大的Region会延长回收时间,过小则降低内存利用率,默认以2048个分区为目标。
二、Card Table(卡表)
作用 :解决跨代引用扫描效率问题,标记老年代中指向新生代对象的引用位置,避免YGC时全量扫描老年代。
实现机制:
- 数据结构
- 将老年代内存划分为512字节的块(Card),使用位图(BitMap)标记脏卡(Dirty Card)。
- 例如,一个4GB老年代对应约800万张卡,仅需约1MB存储位图。
- 写屏障维护
- 当老年代对象引用新生代对象时,触发写屏障将对应Card标记为Dirty,YGC时仅扫描Dirty Card。
三、CSet(Collection Set,回收集合)
定义 :G1垃圾回收中待回收的Region集合,通过动态筛选实现高效回收。
核心规则:
- 组成策略
- 新生代回收:包含所有Eden和Survivor Region。
- 混合回收:加入高垃圾比例的老年代Region(默认回收占比超85%的Region)。
- 优先级算法
- 基于回收价值模型(回收时间与释放空间比),优先选择性价比高的Region加入CSet。
- 例如,回收耗时5ms释放20MB的Region,优先级高于耗时10ms释放15MB的Region。
四、RSet(Remembered Set,记忆集)
作用 :记录跨Region引用关系,避免全局扫描,提升回收效率。
技术细节:
- 数据结构
- 每个Region维护独立RSet,存储其他Region指向本Region的引用指针。
- 采用哈希表或指针数组实现,如引用数量较少时用数组,较多时切换为哈希结构。
- 维护机制
- 写屏障触发:当对象A(Region X)引用对象B(Region Y)时,更新Y的RSet记录X的信息。
- 并行处理:G1通过并发线程批量处理RSet更新,减少对业务线程的影响。
五、协同工作流程示例
以一次G1混合回收为例:
- 标记阶段:通过RSet快速定位跨Region引用,结合Card Table筛选存活对象。
- 筛选CSet:根据回收价值模型选择Eden、Survivor和部分老年代Region。
- 转移阶段:将存活对象复制到空闲Region,同时更新RSet和Card Table。
- 清理阶段:清空原Region并加入空闲队列,RSet和Card Table重置。
总结:
- Region是G1内存管理的基础单元,实现堆空间精细化划分。
- Card Table 优化跨代引用处理,RSet解决跨Region引用跟踪,两者共同减少扫描范围。
- CSet通过动态策略提升回收效率,四者协同实现G1低延迟、高吞吐的目标。