Go-通俗易懂垃圾回收及运行过程

Go 的垃圾回收(GC)就像一个自动的"内存清洁工",它会自动回收程序不再使用的内存空间,避免内存泄漏。整个过程分为 标记存活对象清除垃圾对象 两个核心步骤,并采用 三色标记法 + 并发处理 实现高效回收。


核心原理:三色标记法(Tri-color Marking)

想象内存中的对象被标记为三种颜色:

  1. 白色:待检查对象(初始状态)
  2. 灰色:已扫描但引用的对象未检查完
  3. 黑色 :已扫描且所有引用对象也完成检查(存活对象)
工作流程(分4步)
  1. STW 初始标记(暂停极短)

    • 暂停所有程序(Stop The World)
    • 快速标记根对象 (全局变量、栈变量等)为灰色
    • ⏱️ 耗时:通常 < 1ms
  2. 并发标记(与程序并行运行)

    • 程序恢复运行
    • GC 协程逐步处理灰色队列:
      • 将灰色对象引用的白色对象标记为灰色
      • 当前对象标记为黑色
    • 关键:通过写屏障(Write Barrier) 监控内存修改,确保数据一致性
  3. STW 标记终止(短暂暂停)

    • 再次暂停程序
    • 完成最后标记
    • 确认所有灰色对象已处理完
    • ⏱️ 耗时:通常 1~10ms
  4. 并发清除(与程序并行)

    • 程序恢复运行
    • 回收所有白色对象(未被标记的垃圾)
    • 黑色对象重置为白色(下一轮准备)
相关推荐
梦想很大很大6 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰11 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘15 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤16 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想