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. 并发清除(与程序并行)

    • 程序恢复运行
    • 回收所有白色对象(未被标记的垃圾)
    • 黑色对象重置为白色(下一轮准备)
相关推荐
vipxieliang16 小时前
Go 泛型结构体与约束进阶:从自定义约束到标准库泛型 API 实战
后端·go
GlobalTradercrb1 天前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo
用户125758524361 天前
GoFrame Vue3开源后台管理系统推荐:数据库与Worker要求怎么验
数据库·后端·go
王中阳Go1 天前
面到 harness 架构就卡住的人,多半是做过但没这么叫过
架构·go·agent
人人都是软件工程师2 天前
23-网络编程:从 HTTP 客户端到可维护服务端
go
敲代码的玉米C2 天前
右边留给终端,左边继续翻代码:给砚加锁定列
go
敲代码的玉米C2 天前
设置导进来了,界面却没变:配置不能只管写文件
go
人人都是软件工程师2 天前
24-数据库操作:database/sql、连接池与事务
go
敲代码的玉米C2 天前
从终端敲一行命令,把文件送进已经打开的砚
go
敲代码的玉米C2 天前
两个提交到底差在哪:给砚补上比较和补丁导出
go