Golang GC 三色标记法

三色标记法

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

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

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

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

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

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

第四步: 回收白色对象

强三色标记:

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

弱三色标记:

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

混合屏障:

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

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

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

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

并发标记阶段写屏障触发

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

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

相关推荐
mit6.82412 小时前
bfs|栈
算法
CoderYanger13 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz13 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
稚辉君.MCA_P8_Java13 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*14 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
.YM.Z15 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法
Chat_zhanggong34515 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
百***480715 小时前
【Golang】slice切片
开发语言·算法·golang
q***925115 小时前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
墨染点香15 小时前
LeetCode 刷题【172. 阶乘后的零】
算法·leetcode·职场和发展