Golang GC 三色标记法

三色标记法

Golang GC 会使用三种颜色会对象进行标记。分别为白色、灰色和黑色。白色表示尚未被标记的对象、灰色表示已经追踪但还没标记的对象,黑色表示已经完成标记的对象。黑色表示活跃对象,不会被回收。

以下图所示,演示三色标记法的过程。

第一步: 将所有对象都初始化为白色。

第二步: 遍历根节点,将根节点直接可达的对象,标记为灰色

第三步: 遍历灰色集合,将直接可达的对象标记为灰色,自身标记为黑色。

重复第三个步骤,持续完成所有可能的标记

第四步: 回收白色对象

强三色标记:

插入屏障;针对与堆空间,因为栈空间有各种函数调用会进行压栈操作 这个对性能开销很大,因此只针对与堆空间;主要确定就是栈空间需要进行一次STW 重新扫描一次防止漏扫描;

弱三色标记:

删除写屏障;主要将删除的对象都标记为灰色 也是为了防止漏扫描;主要确定:部分对象再本次扫描中会逃逸 GC精度不高;

混合屏障:

变形弱三色标记;栈空间所有对象都标记为黑色 就放置了栈空间的对象后续需要一次STW重新扫描一次 但是同样存在GC精度不高的问题

并发标记阶段,栈区对象处理

标记阶段,栈上新增对象 9 直接被标记为黑色

因为如果此时新增 9,9 初始化为白色,就会出现漏标。系统需要触发 STW(Stop The World) 来停止程序重新标记,造成较大的性能损失。

并发标记阶段写屏障触发

因为栈区没有写屏障,当对象 9 引用对象 8 时,并不会把对象 8 标记为灰色。

当对象 7 和对象 8 断开引用关系时,触发写屏障,把对象 8 标记为灰色。

相关推荐
ZoeJoy81 小时前
算法筑基(二):搜索算法——从线性查找到图搜索,精准定位数据
算法·哈希算法·图搜索算法
Alicx.1 小时前
dfs由易到难
算法·蓝桥杯·宽度优先
_日拱一卒1 小时前
LeetCode:找到字符串中的所有字母异位词
算法·leetcode
云泽8082 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
Wilber的技术分享2 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病3 小时前
Problem L. ZZUPC
c++·数学·算法·前缀和
梯度下降中4 小时前
LoRA原理精讲
人工智能·算法·机器学习
IronMurphy4 小时前
【算法三十一】46. 全排列
算法·leetcode·职场和发展
czlczl200209254 小时前
力扣1911. 最大交替子序列和
算法·leetcode·动态规划
靴子学长4 小时前
Decoder only 架构下 - KV cache 的理解
pytorch·深度学习·算法·大模型·kv