地产网站开发,公司做的网站如何开启伪静态,网页设计图片,wordpress 视频 播放器插件下载Go语言采用了3色标记清理法来对内存进行自动垃圾回收#xff0c;
过程是这样的#xff1a; #xff08;1#xff09;起初所有的对象都是白色的#xff1b; #xff08;2#xff09;从根对象出发扫描所有可达对象#xff0c;标记为灰色#xff0c;放入待处理队列…Go语言采用了3色标记清理法来对内存进行自动垃圾回收
过程是这样的 1起初所有的对象都是白色的 2从根对象出发扫描所有可达对象标记为灰色放入待处理队列 3从待处理队列中取出灰色对象将其引用的对象标记为灰色并放入待处理队列中自身标记为黑色 4重复步骤3直到待处理队列为空此时白色对象即为不可达的“垃圾”回收白色对象
相比Java中的很多垃圾回收方法Go的标记清理有很大不同Go中没有划分代的概念。
为什么标记阶段需要STW呢
其中标记动作是需要进行STW的标记结束之后关闭STW。为什么这么设计呢 三色标记法不使用STW的时候有可能会出现在结束某处的扫描后新加入的依赖对象初始化为白色会被直接清理掉。为了防止清理无辜对象需要引入STW。
什么是根引用对象
Go 程序的根节点通常包括以下几类对象
程序的全局变量和静态变量这些变量在整个程序执行过程中都可以被访问到因此垃圾回收器会将它们作为根节点。程序的调用栈中的变量这些变量在函数调用过程中被创建并在函数返回时被销毁。因此在函数调用期间它们被认为是根节点。当前执行的Goroutine在 Go 语言中Goroutine 是轻量级的线程它们可以独立地运行因此当前执行的Goroutine也被认为是根节点。
什么是强弱三色不变式
强弱三色不变式的目标是保持以下两个性质
强三色不变式Strong Tri-Color Invariant在任何时刻灰色对象不会直接或间接引用白色对象。这意味着垃圾回收器不会遗漏任何可达的对象。弱三色不变式Weak Tri-Color Invariant在垃圾回收的过程中黑色对象不会再次引用白色对象。这样可以确保垃圾回收器不会将已经回收的对象误认为存活对象。
通过维护这两个不变式垃圾回收器可以正确地标记和清除不再使用的对象同时避免将存活对象错误地回收。