Golang 垃圾回收

GC(垃圾回收)原理1.5版本

三色标记法:

  1. 概念

    白色: 代表最终需要清理的对象内存块

    灰色: 待处理的内存块

    黑色:活跃的内存块

  2. 流程:

    1. 起初将所有对象都置为白色
    2. 扫描出所有的可达(可以搜寻到的)对象,也就是还在使用的,不需要清理的对象,标记为灰色,放入待处理队列
    3. 从队列中提取灰色对象,将其引用对象标记为灰色放入队列,将自身标记为黑色
    4. 有专有的锁监视对象内存修改
    5. 在完成全部的扫描和标记工作之后,剩余的只有黑色和白色,分别代表活跃对象与回收对象
    6. 清除所有的白色对象

简述Go的垃圾回收机制

go目前使用的垃圾回收机制是三色标记法配合写屏障和辅助GC

三色标记法是对标记回收算法的改进:

  1. 初始阶段所有对象都是白色
  2. 从root根出发扫描根对象,将它们引用到的对象都标记为灰色,其中root区域主要是当前程序运行到的栈和全局数据区域,是实时使用到的内存
  3. 将灰色对象标记为黑色,分析该灰色对象是否引用了其他对象,如果引用其他对象,就将引用到的其他对象标记为灰色
  4. 不断分析灰色对象,直到灰色对象队列为空,此时白色对象即为垃圾,进行回收

在内存管理中,allocBits记录了每块内存的分配情况,而gcmarkBits记录了每块内存的回收情况,在标记阶段会对每块内存进行标记,有对象引用的标记为1,没有的标记为0,结束标记后,将allocBits指向gcmarkBits,则有标记的才是存活的内存块,这样就完成了内存回收

进行垃圾回收需要进行STW,如果STW时间过长对于应用执行来说是灾难性的,因此为了缩短STW的时间引入了写屏障和GCC

写屏障是让GC和应用程序并发执行的手段,可以有效减少STW的时间

辅助GC是为了防止GC过程中内存分配的速度过快,因此会在GC过程中让mutator线程并发执行,协助GC执行一部分回收工作

GC触发机制有:

  1. 内存分配量达到阈值,每次内存分配前都会检查当前内存分配量是否达到阈值,如果达到则出发GC,阈值= 上次GC时的内存分配量*内存增长率
  2. 定时触发GC:默认情况下两分钟触发一次GC,可由runtime中的参数声明
  3. 手动触发GC:可以在代码中通过使用runtime.GC()来手动触发
相关推荐
FfHUCisI1 小时前
Golang SSA 中间表示与优化 Pass
开发语言·后端·golang
JavaPub-rodert11 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
QX_hao17 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
圣殿骑士-Khtangc18 小时前
Go-Kubernetes-CRD自定义资源开发从零实现Operator模式
golang
北漂燕郊杨哥1 天前
DotMD:一款基于 Go + Wails 的轻量开源 Markdown 桌面编辑器
golang·开源·编辑器·markdown·md
运维开发笔记1 天前
5.1 Go 数组学习笔记
golang
互联网中的一颗神经元2 天前
06. Small 对象分配:mcache 无锁路径
开发语言·golang
abcefg_h2 天前
MCP 实战指南:如何在项目中使用 Model Context Protocol 及其通信原理
开发语言·后端·golang·mcp
ylj_dev2 天前
从 0 构建 AI Workload Platform(四):从单机工作流内核到可靠控制面
docker·postgresql·架构·golang
FfHUCisI2 天前
Golang database/sql 标准库基础
数据库·sql·golang