Panda白话 - G1垃圾收集器 - SATB、写屏障

本文深入解析G1垃圾收集器的三色标记法,探讨其存在的漏标问题,以及Taiichi Yuasa的SATB算法如何通过快照机制和写屏障优化并发标记,减少垃圾识别误差,重点关注白色垃圾的处理和写前屏障在其中的作用。

Panda白话 - G1垃圾收集器 - 三色标记法、漏标、增量更新、SATB
上文讲到G1在并发标记过程中,通过三色标记法来标记存活对象, 三色标记法存在漏标问题,会影响程序正确性, G1采用SATB方案解决漏标问题,本文我们就来重点分析一下SATB

SATB - Snapshot At The Beginning 初始快照

  • 由Taiichi Yuasa开发的一个算法 - 首先它是一种思想
  • 主要用于GC的并发标记阶段
  • 记录并发标记是mutator修改的引用记录,remark阶段(STW)无需全量重新扫描标记
  • 快照是以BitMap(位图)的方式实现,BitMap存放对象存活标记,1 为黑色 即存活
    在这里插入图片描述

见上图、Region包含了5个指针:

  • Bottom - 总是指向Region的起始位置
  • Previous TAMS - 指向上一次并发处理后的地址
  • Next TAMS - 指向并发标记开始之前内存已经分配成功的地址
  • Yop - 指向当前内存分配成功的地址
  • End - 总是指向Region的终点位置

TAMS - top-at-mark-start
对象在Region中是连续分配的

可以知道:

  • [Bottom,End]区间就是Region内存空间大小
  • [Bottom,Prev]区间就是上次并发标记结束后,已经标记过的对象内存
  • [Prev,Next]区间就是本次并发标记标记到的对象内存
  • [Next,Top]区间就是并发标记过程中Mutator新增的对象分配的内存地址
  • [Top,End] 区间就是Region还未分配的空闲内存

由上可知,Prev和Next指针解决了并发标记中内存区域问题,并发标记引入了两个**数据结构**来记录内存标记状态,

  • PrevBitMap - 记录Prev指针之前内存标记情况、即【Bottom,Prev】区间
  • NextBitMap - 记录Next指针之前内存标记情况、即【Bottom,Next】区间
    图解两次并发标记过程:
    在这里插入图片描述

第一次并发标记开始前 :

  • PrevBitMap 为空,NextBitMap 待标记
    在这里插入图片描述

第一次标记结束后:

  • NextBitMap 标记了分区对象存活情况
  • NextBitMap位图中黑色区域表示对应对象存活
  • 并发标记过程中Mutator继续运行,产生新的对象,Top指针继续增长
    -

第二次并发标记开始前:

  • 重置指针,Prev指针指向Next指针位置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值