首页 > 其他分享 >gc三色标记法

gc三色标记法

时间:2023-12-09 16:36:18浏览次数:26  
标签:标记 对象 三色 STW 屏障 gc 内存 回收

一 概念基础
1.1三色标记法将对象分为三类
把图过程中遇到的对象,按“是否访问过”这个条件标记成以下三种颜色:

1.白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。

灰色对象(临时状态):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。

黑色对象(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

1.2 标记过程
起初所有的对象都是白色的;
从根对象出发扫描所有可达对象,标记为灰色,放入待处理队列;
从待处理队列中取出灰色对象,将其引用的对象标记为灰色并放入待处理队列中,自身标记为黑色;
重复步骤3,直到待处理队列为空,此时白色对象即为不可达的“垃圾”,回收白色对象;
回收所有的白色对象,也就是回收垃圾
根对象

在垃圾回收的术语中又叫做根集合,它是垃圾回收器在标记过程时最先检查的对象。

全局变量:程序在编译期就能确定的那些存在于程序整个生命周期的变量。
执行栈:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。
寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。
1.3 STW
STW(Stop The World)机制是指在进行垃圾回收时,会暂停应用程序的运行,以便进行垃圾回收操作。这意味着在进行垃圾回收时,应用程序将无法继续执行。

为什么需要STW
STW(Stop-The-World)机制来确保并发操作的正确性。

如果不设置STW机制,那么在进行GC时,应用程序线程可能会继续执行,从而导致内存管理的不一致性和错误。此外,GC可能会导致内存分配和释放的不连续,从而导致内存碎片化问题。

因此,需要STW机制来确保GC的正确性和内存管理的一致性。虽然STW机制会导致一定的性能损失,但是这是必要的代价,以确保应用程序的正确性和稳定性。

1.4 屏障机制(目的是为了保证对象不丢失)
1.4.1强、弱三色不变式
强三色不变式:
强制性的不允许黑色对象引用白色对象,只能引用灰色对象,这样就不会出现白色对象被误删的情况。

弱三色不等式 :
保护灰色对象到白色对象的路径不会断;

黑色对象可以引用白色对象,白色对象存在其他灰色对象对它的引用。
或可达它的链路上游存在灰色对象。这样实则是黑色对象引用白色对象,白色对象处于一个被删除的状态,但是上游灰色对象的引用,可以保护白色对象,使其安全。

为了遵循上述两种方式,GC算法演进到两种屏障方式,“插入屏障”和“删除屏障”。

1.4.2 插入屏障
在A对象引用B对象时,B对象被标记为灰色。(将B挂在A下游,B必须被标记为灰色)

满足强三色不等式。

插入屏障机制在栈空间的对象操作不使用,仅仅使用在堆空间对象的操作中。

1.4.3 删除屏障
被删除的对象,如果本身为灰色或白色,那么标记为灰色。

满足弱三色不等式。

1.4.4 混合屏障
插入写屏障和删除写屏障的缺点:

插入写屏障:结束时需要STW来重新扫描栈,标记栈上引用的白色对象存活
删除写屏障:回收精度低,GC开始时STW扫描堆栈来记录快照,这个过程会保护开始时刻的所有的存活对象。
Go1.8引入混合写屏障机制,避免了对栈的重复扫描过程,极大减少了STW的时间。

GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW)
GC期间,任何在栈上创建的新对象,都标记为黑色

被删除的对象标记为灰色(无论栈还是堆)
被添加的对象标记为灰色(无论栈还是堆)

注意:屏障技术是不在栈上应用的,因为要保证栈的运行效率。

1.4.5 混合写屏障的具体场景

混合写屏障是Gc的一种屏障机制,所以只是当程序执行GC的时候,才会触发这种机制。
场景一: 对象被一个堆对象删除引用,成为栈对象的下游
场景二: 对象被一个栈对象删除引用,成为另一个栈对象的下游
场景三:对象被一个堆对象删除引用,成为另一个堆对象的下游
场景四:对象从一个栈对象删除引用,成为另一个堆对象的下游
Golang中的混合写屏障满足弱三色不变式,结合了删除写屏障和插入写屏障的优点,只需要在开始时并发扫描各个goroutine的栈,使其变黑并一直保持,这个过程不需要STW,而标记结束后,因为栈在扫描后始终是黑色的,也无需再进行re-scan操作了,减少了STW的时间。

二 GC过程
2.1 阶段1:Mark Setup 标记准备
为了打开写屏障,必须停止每个goroutine,让垃圾收集器观察并等待每个goroutine进行函数调用,等待函数调用是为了保证goroutine停止时处于安全点。(期间会STW)

2.2 阶段2:Marking 标记
一旦写屏障打开,垃圾收集器就开始标记阶段。

标记阶段需要标记在堆内存中仍然在使用中的值。首先检查所有现goroutine的堆栈,以找到堆内存的根指针。然后收集器必须从那些根指针遍历堆内存图,标记可以回收的内存。

当存在新的内存分配时,会暂停分配内存过快的那些 goroutine,并将其转去执行一些辅助标记(Mark Assist)的工作,从而达到放缓继续分配、辅助 GC 的标记工作的目的。

2.3阶段3:Mark Termination 标记结束
这个阶段会关闭掉阶段1开启的屏障,并计算下一次清理的目标和计划。(本阶段会STW)

2.4 阶段4:Sweeping 清理
清理阶段用于回收标记阶段中标记出来的可回收内存。当应用程序goroutine尝试在堆内存中分配新内存时,会触发该操作,清理导致的延迟和吞吐量降低被分散到每次内存分配时。

本阶段会并发执行,清除前面标记出来需清理的内存。

三、如何触发GC

四、调优方法

 五、总结

GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低;

GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通;

GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

标签:标记,对象,三色,STW,屏障,gc,内存,回收
From: https://www.cnblogs.com/beatle-go/p/17891116.html

相关文章

  • 无序对的$gcd$
    \(N\)为上确界,\(n\)为\(a\)数组元素个数,\(D\)为约数个数。方法一\(1.\)求出\(d\),\(d[i]\)表示\(i\)的所有约数(有序)。时间复杂度:\(O(NlogN)\)vector<int>d[N+1];for(inti=1;i<=N;i++)for(intj=i;j<=N;j+=i)d[j].pb(i);\(2.\)求出\(f......
  • Termux安装GCC编译器
    cctoolspkgupdatepkginstall-ycoreutilsgnupgcurl-sLo$PREFIX/etc/apt/trusted.gpg.d/cctools.asc--create-dirshttps://cctools.info/public.keyecho"deb[trusted=yes]https://cctools.infotermuxcctools"|tee$PREFIX/etc/apt/sources.list......
  • WGCLOUD常见问答 - 可以监测MAC地址信息吗
    可以的......
  • 交叉编译工具 arm-none-linux-gnueabihf-gcc安装及思考
    1安装步骤A创建目录:/usr/local/armB将交叉编译器(压缩包)复制到该目录,在该目录下进行解压得到“gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf”的文件C打开/etc/profile文件添加环境变量       sudovi/etc/profile  exportPATH=......
  • 『做题记录』[AGC032B] Balanced Neighbors
    [AGC032B]BalancedNeighborslink:https://atcoder.jp/contests/agc032/tasks/agc032_bDescription  给定整数\(N\),构造一个从\(1\)到\(N\)编号的\(N\)个节点的无向图,使得:该图不含有重边和自环,并且是连通的。每个节点的所有邻接节点的编号之和相同。  \(N\l......
  • 运维平台WGCLOUD 如何监测交换机的端口状态 UP | DOWN
    WGCLOUDv3.5.0开始可以监测交换机或SNMP设备的接口状态了,直接上图......
  • [AGC049D] Convex Sequence 题解
    题目链接点击打开链接题目解法好题!!考虑原题的限制相当于原序列下凸,即差分数组单调考虑把原序列在第一个最小值处割成\(2\)半因为原序列是凸的,所以非最小值的长度是\(\sqrt{2m}\)级别的这可以让我们\(dp\)差分数组,即求满足\(\sum\limits_{i=1}^{n'}ib_i=m'\)的\(b......
  • 地图坐标转换 WGS84、BD09与GCJ02的相互转换
    高德地图WGS84转GCJ02exportfunctionwgs84ToGcj02(lng,lat){if(out_of_china(lng,lat)){return[lng,lat]}else{vardlat=transformlat(lng-105.0,lat-35.0)vardlng=transformlng(lng-105.0,lat-35.0)v......
  • [AGC040D] Balance Beam
    [AGC040D]BalanceBeam颇有难度的一道题。首先思考我们的手上有什么武器可以使用。发现如果石板的排列确定下来,那么合法的B一定是形如\([0,x)\)的一段区间。我们只需令\(x\)最大即可。同时,显然可以认为终点一定在整点上。题目中很为难我们的一点是位置并不是离散的,所以......
  • Springcloud学习笔记58--SpringBoot拦截全局异常统一处理(RestControllerAdvice注解)
    1. 应用场景如果和前端约定好使用固定的自定义格式返回参数,如下:{"code":200,"msg":"操作成功","data":{"equipment":55,"code":99,"point":2}}但在运行时发现了异常,默认的异常返回格式如下:......