关于G1 GC 的一些研究
发布网友
发布时间:2024-09-28 11:51
我来回答
共1个回答
热心网友
时间:2024-10-20 08:33
Garbage First (G1)回收器技术,于04年论文提出,6 Update 14测试版发布,12年JDK7正式发布,后替代Parallel Scavenge和Parallel Old组合,成为JDK9的默认Server端垃圾回收器。G1面向Region,不固定分代区域大小,将堆划分为多个大小相等的Region,每个可充当Eden、Survivor或老年代。大对象存储在专门的Humongous Region,超过Region容量一半,部分作为老年代。Region大小可通过参数-XX:G1HeapRegionSize设定,范围1mb-32mb,需为2的N次幂。
G1执行流程包括初始标记、并发标记、最终标记和清除。初始标记仅扫描GC Roots,标记直接关联对象,修改Region TAMS指针,不依赖mark word中的mark bit,使用外部bitmap。并发标记从GC Roots扫描堆对象图,不断从扫描栈取出引用进行标记,处理SATB write barrier记录的引用和更新Rset。最终标记处理并发阶段遗留的SATB记录。清除阶段使用CSet作为回收集合,根据统计模型选定收益最高、开销不超过用户指定期望停顿时间的若干个Region进行清理。
SATB(Snapshot At The Beginning)解决并发标记中的对象消失问题,G1通过前置写屏障实现,记录引用变化的旧值,确保所有引用变化记录在案。TAMS(Top at Mark Start)指针规定新对象分配位置,所有对象默认标记为存活状态,即便在并发标记结束前死亡。logging write-barrier异步执行write-barrier,提高mutator性能,减少垃圾收集延迟。
Remembered Set(RSet)用于记录从非收集区域指向收集区域的引用,G1在传统的卡表基础上添加一层结构,构成points-into关系,记录其他region指向自己的指针和范围。RSet是一种哈希表,用于减少全局扫描,提高效率。
G1回收集CSet(Collection Set)用于控制每次垃圾收集的成本和停顿时间,基于“衰减平均值”理论分析每个Region的成本和回收价值,生成Cset,采用并行复制算法清理Cset内的活对象。根据应用实际情况,选择合适的期望停顿时间,以达到平衡性能和用户体验。
G1支持两种模式:Young GC和Mixed GC,根据内存使用情况自动切换,以避免Concurrent Mode Failure(并发模式失败)导致的全堆收集。在Mixed GC无法跟上应用分配速度,或old gen充满无法继续执行Mixed GC时,G1会切换至Serial Old GC进行全堆收集,产生长时间暂停。
使用G1时,应合理设置期望停顿时间,避免过快导致并发模式失败,或过慢导致每次停顿时间过长。G1回收器的特性使其成为高并发应用的理想选择,通过优化堆内存管理和垃圾收集过程,提供更好的性能和用户体验。