Golang GC学习笔记

GC:垃圾回收

V1.3之前 标记清除法

流程

  1. STW暂停
  2. 标记可达对象
  3. 清理不可达对象
  4. stw结束

缺点

  1. STW 程序暂停出现卡顿(*)
  2. 标记扫码整个heap(堆)
  3. 清除数据产生heap碎片

V1.5 三色标记法

流程

白色 :开始之前所有对象都标记为白色,到最后剩下的白色标记都是要被清理的

灰色 : 中间状态,最后没有灰色标记的对象

黑色 :标记为黑色的对象不需要清理

如果不加STW会出现的问题

image-20241218102154920

1.白色被挂在黑色下

2.灰色同时丢了该白色

就会导致白色对象丢失

强三色不变式

不允许黑色对象引用白色对象

image-20241218154739782

弱三色不变式

黑色可以引用白色对象,但是要求白色对象存在其他灰色对象对他的引用或者在白色对象的可达链路上游存在灰色对象

V1.8 三色标记法+混合写屏障机制

解释

插入屏障:对象被引用时 触发的机制

删除屏障:对象被删除时 触发的机制

混合: 结合插入屏障和删除屏障

插入屏障

在A对象引用B对象时,B对象被标记为灰色 满足强三色不变式不存在黑色对象引用白色对象,因为白色会强制变成灰色

不在栈上使用,结束时需要STW重新扫秒栈 10-100ms

image-20241218162016198

删除屏障

被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。 满足弱三色不变式保护灰色对象到白色对象的路径不会断

回收精度低 一个对象即使被删除了最后一个指向他的指针也依旧可以活过一轮,将在下一轮GC中被清理掉

删除之前会有一个短暂的STW保存快照信息,用于对比结果,只是耗时很少

image-20241218163019978

混合写屏障

  1. GC开始时将栈上的可达对象标记为黑色,以后不在进行重复扫描,无需STW

  2. GC期间,任何在上创建的新对象,均为黑色

  3. 删除引用的对象标记为灰色(沿用删除写屏障特点)

  4. 添加的对象标记为灰色

    满足了变形的弱三色不等式

    image-20241219140852003

场景一:对象被一个堆对象删除引用,成为栈对象的下游

image-20241219142554335

场景二:对象被一个栈对象删除引用,成为另一个栈对象的下游

image-20241219143451753

场景三:对象被一个堆对象删除引用,成为另一个堆对象的下游

image-20241219144004050

场景四:对象被一个栈对象删除引用,成为另一个堆对象的下游

image-20241219144438384