G1数据结构

‌G1垃圾回收算法的内部结构‌以"化整为零"的分区思想为核心,将整个Java堆划分为多个大小相等的独立区域(Region),每个Region大小通常为1~32MB(2的幂次方),由JVM根据堆大小自动设定 。这种结构打破了传统垃圾回收器对堆内存的固定分代布局,实现了更灵活、高效的内存管理。

一、Region:G1的基本单位

G1将堆内存划分为‌多个固定大小的Region‌,每个Region在运行时可动态扮演不同角色:

  • E Eden区‌:存放新创建的对象。
  • S Survivor区‌:存放经过一次Young GC后仍存活的对象。
  • O Old区‌:存放长期存活或从年轻代晋升的对象。
  • H Humongous区‌:专门用于存储大对象(大小超过Region容量一半的对象) 。
    例如,在一个4GB堆、Region大小为2MB的配置下,任何超过1MB的对象都会被直接分配到Humongous Region中 。
    这种动态角色分配机制使得G1能根据应用行为灵活调整内存布局,避免了传统分代回收器中年轻代与老年代比例固定的僵化问题。

二、关键数据结构与机制

1. ‌Remembered Set(RSet,记忆集)

每个Region都维护一个RSet,用于记录‌其他Region中对象对该Region的引用关系‌

在进行年轻代回收(Young GC)时,G1无需扫描整个老年代来判断跨代引用,只需扫描RSet中记录的引用即可,极大提升了效率 。

2. ‌Card Table(卡表)

‌RSet的底层实现依赖于‌卡表(Card Table)‌。堆内存被划分为若干个512字节的"卡(Card)",每个卡对应卡表中的一个字节。当发生跨Region引用时,相应卡被标记为"脏卡(Dirty Card)",后续通过扫描脏卡来更新RSet 。

可以理解为:‌Card Table是RSet的数据来源,RSet是G1实现高效跨代引用处理的核心机制‌

3. ‌SATB(Snapshot-At-The-Beginning)

在并发标记阶段,为保证标记准确性,G1采用SATB算法。它在标记开始时记录堆的逻辑快照,任何在并发期间被修改或删除的对象引用,都会通过写屏障(Write Barrier)记录到队列中,供最终标记阶段处理,防止漏标 。

‌4. ‌TAMS(Top at Mark Start)指针

为支持并发标记期间的新对象分配,G1为每个Region设置了两个TAMS指针(Previous和Next),划分出用于记录并发阶段新分配对象的空间。这些对象默认被视为"已存活",不参与本次标记过程 。

三、回收流程与阶段划分

G1的回收周期主要包括以下阶段:
1‌. Young GC‌ :当Eden区满时触发,STW暂停,复制存活对象到Survivor或Old区。
‌2. 并发标记(Concurrent Marking)‌ :当堆占用达到阈值(默认45%)时启动,标记整个堆的存活对象。
‌3. Mixed GC‌ :在并发标记完成后,优先回收垃圾比例高的Region,包括部分老年代。
4‌. Full GC‌:极端情况下(如空间不足或碎片严重)触发,单线程执行,应尽量避免

相关推荐
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
一直C17 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
淡海水17 小时前
04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构
数据结构·算法·c#·哈希算法·编译·字典·dictionary
疯狂打码的少年19 小时前
【数据结构】板块总结 + 下期预告(数据库技术)
数据结构·笔记·算法
郝学胜-神的一滴19 小时前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
dtq042420 小时前
数据结构 - 线性表 - 单链表
数据结构
1000世界小札21 小时前
排序算法全景总结:从 O(n²) 到 O(n log n),再到线性时间(附完整对比与选型指南)
数据结构·算法·排序算法
玉树临风ives21 小时前
atcoder ABC 472 题解
数据结构·c++·算法
李可以量化1 天前
Redis Client 从入门到精通(一)下:redis-py 核心数据结构操作与连接管理
数据结构·redis·python·bootstrap·量化交易·qmt