讲师中心 微信公众号
AI工具推荐 视频效率加速

Go 垃圾回收三色标记清除算法全流程详解

雨涛吖_7753

雨涛吖_7753

发布时间:2026-01-17 13:42:09

|

952人浏览过

|

来源于php中文网

原创

Go三色标记清除是分阶段并发GC,通过写屏障保障强三色不变式,STW仅限根扫描与栈重扫,清除异步按页进行,延迟压至百微秒级。

go 垃圾回收三色标记清除算法全流程详解

Go 的三色标记清除(Tri-color Marking + Sweep)不是一次性停顿扫描,而是一个分阶段、带写屏障保护的并发回收流程。它核心目标是把 STW(Stop-The-World)压缩到毫秒级,同时不丢对象、不误回收。

三色状态的本质含义

所谓“三色”,是逻辑抽象,并非真实存储颜色值:

  • 白色:初始默认状态,表示“尚未确认是否可达”;GC 结束后仍为白色的对象即为垃圾,会被清除
  • 灰色:已确认可达,但其引用的对象还没被扫描;它们被存放在一个标记队列(gcWork)中,等待处理
  • 黑色:已完全扫描完毕,该对象及其所有直接/间接引用都已纳入标记范围;本次 GC 中不会被回收

标记阶段的四步主流程

标记不是全堆扫一遍,而是从根集合出发,逐步推进灰色边界,直到灰色队列清空:

  • 将所有根对象(全局变量、各 goroutine 栈上指针、寄存器等)标记为灰色,并入队
  • 从队列取一个灰色对象,扫描它持有的所有指针字段
  • 对每个指针指向的白色对象,将其标记为灰色并入队
  • 当前对象自身标记为黑色;重复直到队列为空

此时所有可达对象非黑即灰(灰是过渡态),白色对象即为不可达垃圾。

协同养育操作系统
协同养育操作系统

协同养育操作系统(Co-Parenting OS)— 离异家庭专业协同养育支持系统。12模块覆盖接送管理、成长记忆库、孩子观察站、亲子关系粘合剂、共同挑战中心、情绪冲突观察、父母成长、成长档案馆、成长阶段引擎、风险预警、驾驶舱、被恶意攻击急救包。当用户涉及离异家庭育儿、协同养育、抚养探视、接送安排、孩子成长记录、亲子关系、离异冲突、被恶意攻击、前任矛盾等话题时触发。

下载

为什么需要写屏障?防止对象丢失

因为标记和用户代码并发执行,若不加干预,可能出现“黑色对象引用新创建的白色对象”,而该白色对象又无其他灰色路径可达——它就会被漏掉、误回收。这就是违反强三色不变式。

Go 自 1.8 起采用混合写屏障(hybrid write barrier),在指针赋值时插入检查逻辑:

  • 当发生 A.field = B,且 A 已是黑色、B 是白色时,强制将 B 标记为灰色
  • 该机制覆盖堆上写操作,配合最后的 STW 栈重扫描,确保栈上新产生的指针也被捕获

清除阶段如何做到几乎无停顿

清除不再像早期那样遍历整个堆,而是按页(page)异步清理:

  • 标记结束后,白色对象的内存页被标记为“可回收”,但不立即归还 OS
  • 后续内存分配时,优先复用这些页;真正释放给操作系统由后台线程按需完成
  • Go 1.19 引入软内存限制(GOMEMLIMIT),让清除更主动响应内存压力

因此,清除本身基本不造成用户可观测延迟,真正的 STW 只发生在标记开始前的根扫描准备,以及标记结束后的栈重扫描,通常控制在百微秒级。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

5065

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2150

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6607

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2748

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6607

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2748

2023.08.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn