为什么这么设计—— Go的GC

Go语言采用了3色标记清理法来对内存进行自动垃圾回收,

过程是这样的:

(1)起初所有的对象都是白色的;

(2)从根对象出发扫描所有可达对象,标记为灰色,放入待处理队列;

(3)从待处理队列中取出灰色对象,将其引用的对象标记为灰色并放入待处理队列中,自身标记为黑色;

(4)重复步骤(3),直到待处理队列为空,此时白色对象即为不可达的"垃圾",回收白色对象;

相比Java中的很多垃圾回收方法,Go的标记清理有很大不同,Go中没有划分代的概念。

为什么标记阶段需要STW呢?

其中,标记动作,是需要进行STW的,标记结束之后,关闭STW。为什么这么设计呢?

三色标记法不使用STW的时候有可能会出现:在结束某处的扫描后,新加入的依赖对象初始化为白色,会被直接清理掉。为了防止清理无辜对象,需要引入STW。

什么是根引用对象?

Go 程序的根节点通常包括以下几类对象:

  1. 程序的全局变量和静态变量:这些变量在整个程序执行过程中都可以被访问到,因此垃圾回收器会将它们作为根节点。
  2. 程序的调用栈中的变量:这些变量在函数调用过程中被创建,并在函数返回时被销毁。因此,在函数调用期间,它们被认为是根节点。
  3. 当前执行的Goroutine:在 Go 语言中,Goroutine 是轻量级的线程,它们可以独立地运行,因此当前执行的Goroutine也被认为是根节点。

什么是强弱三色不变式

强弱三色不变式的目标是保持以下两个性质:

  1. 强三色不变式(Strong Tri-Color Invariant):在任何时刻,灰色对象不会直接或间接引用白色对象。这意味着垃圾回收器不会遗漏任何可达的对象。
  2. 弱三色不变式(Weak Tri-Color Invariant):在垃圾回收的过程中,黑色对象不会再次引用白色对象。这样可以确保垃圾回收器不会将已经回收的对象误认为存活对象。

通过维护这两个不变式,垃圾回收器可以正确地标记和清除不再使用的对象,同时避免将存活对象错误地回收。

相关推荐
朱嘉鼎1 小时前
C语言之可变参函数
c语言·开发语言
北冥湖畔的燕雀4 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
QX_hao5 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白5 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
Evand J7 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
爱喝白开水a8 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway8 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康8 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼8 小时前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农9 小时前
JavaSE面向对象(下)
java·开发语言