Golang GC 三色标记法

三色标记法

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

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

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

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

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

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

第四步: 回收白色对象

强三色标记:

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

弱三色标记:

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

混合屏障:

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

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

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

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

并发标记阶段写屏障触发

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

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

相关推荐
猫头虎16 分钟前
2025年02月11日 Go生态洞察:Go 1.24 发布亮点全面剖析
开发语言·后端·python·golang·go·beego·go1.19
恣艺2 小时前
LeetCode 1074:元素和为目标值的子矩阵数量
算法·leetcode·矩阵
queenlll2 小时前
P1064 [NOIP 2006 提高组] 金明的预算方案 题解
算法
WildBlue3 小时前
前端算法秘籍:BFS 算法的 JS 魔法之旅🤩
前端·javascript·算法
Python涛哥3 小时前
go语言基础教程:【2】基础语法:基本数据类型(整形和浮点型)
android·开发语言·golang
设计师小聂!4 小时前
力扣---------238. 除自身以外数组的乘积
数据结构·算法·leetcode
minji...4 小时前
数据结构 二叉树(2)---二叉树的实现
数据结构·算法
ん贤4 小时前
GMP模型
运维·服务器·后端·golang
草香农4 小时前
Keccak 算法详解
算法
哈基咩4 小时前
Go语言unsafe包深度解析
服务器·开发语言·后端·golang