当前位置: 首页 > news >正文

Golang GC 三色标记法

三色标记法

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

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

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

image-20250215212323870

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

image-20250215212430279

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

image-20250215212539686

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

image-20250215212728267

第四步: 回收白色对象

image-20250215212818927

强三色标记:

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

弱三色标记:

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

混合屏障:

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

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

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

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

image-20250215214032763

并发标记阶段写屏障触发

image-20250215214231772

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

image-20250215214313683

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

image-20250215214431545

http://www.lryc.cn/news/538354.html

相关文章:

  • 重新出发的LLM本地部署——DeepSeek加持下的Ollama+OpenWebUI快速部署
  • 【第3章:卷积神经网络(CNN)——3.5 CIFAR-10图像分类】
  • Django后台新建管理员
  • 【第12章:深度学习与伦理、隐私—12.2 数据隐私保护与差分隐私技术的实现与应用】
  • 索引----数据库
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十七节】
  • nodejs:express + js-mdict 网页查询英汉词典,能显示图片
  • matlab汽车动力学半车垂向振动模型
  • 2025.2.16
  • 图像生成GAN和风格迁移
  • 【06】泛型
  • 1-13 tortoiseGit忽略文件与文件夹
  • ASR强力模型「Whisper」:解密Whisper:AI驱动的语音识别新时代 -
  • 【机器学习】向量化使得简单线性回归性能提升
  • 【kafka系列】消费者
  • HackerRank C++面试,中等难度题目 - Attribute Parser
  • 【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题
  • 节目选择器安卓软件编写(针对老年人)
  • 蓝桥杯之图
  • 中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号
  • 【kafka系列】Kafka如何保证消息不丢失?
  • AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python
  • vue3响应式丢失解决办法(三)
  • BY组态:构建灵活、可扩展的自动化系统
  • 2025 (ISC)²CCSP 回忆录
  • 强化学习笔记7——DDPG到TD3
  • win10 系统 自定义Ollama安装路径 及模型下载位置
  • -bash:/usr/bin/rm: Argument list too long 解决办法
  • 内容中台重构企业内容管理流程驱动智能协作升级
  • python实现YouTube关键词爬虫(2025/02/11)