golang垃圾回收

4.29

Golang中GC回收机制三色标记与混合写屏障

第14讲-总结哔哩哔哩bilibili

三个阶段

gc垃圾回收

早期是

GO1.3 标记清除

之前的标记清除:开始标记找到可达对象,并标记,标记完后清楚未标记的

较长时间的STW,使程序暂停,程序出现卡顿

GO1.5

三色标记法 根据强弱三色不变式 指定了插入写屏障和删除写屏障

插入写屏障 删除写屏障

插入写屏障最后要启用栈上的gc

删除写屏障 回收精度低

白色 灰色 黑色

三色标记最不希望发生的事情:一个白色对象被黑色对象引用(白色对象被黑色对象引用)

灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

同时满足,对象丢失

如果三色标记满足强弱不变式之一,即可保证不丢失对象

开始都是白色,然后从根节点开始遍历所有的对象,把便利到的对象从白色放入灰色

然后遍历灰色,将灰色的引用对象放入灰色,将灰色放入黑色。重复直到灰色对象全部消失

回收所有的白色对象,也就是回收垃圾

也还是需要STW来保护全过程

如果不使用 STW来保护会出现的问题:

  • 一个白色对象被黑色对象引用,白色被挂在黑色下

  • 灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

  • 两个条件同时满足,那么就会出现对象丢失的现象

就会出现合法对象被回收

引入强弱三色不变式

强三色不变式: 强制性不允许黑色对象引用白色对象

弱三色不变时: 黑色对象也可以引用白色对象,白色对象存在其他灰色对象对它的引用,或者可达它的链路上存在灰色对象

如果三色标记满足强弱不变时之一,即可保证不丢失对象

强弱三色标记引申出插入屏障和删除屏障

插入写屏障:当A对象引用B对象的时候,B对象被标记为灰色

不在栈上使用 还会有栈上额外的短时间的暂停 大约需要10-100ms

结束时需要STW来重新扫描栈 可能出现黑色引用白色

删除写屏障:被删除的对象,如果自身为灰色或者白色,都被标记为灰色

保护灰色对象到白色对象的路径不会断

回收精度低

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

具体操作: GC开始将栈上的对象全部扫描并标记为黑色

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

被删除的对象标记为灰色

被添加对象标记为灰色

变形的弱三色不变式(结合两者优点)

混合写屏障:目的不再使用STW

混合写屏障的四种情况:

  • 对象被一个栈对象引用,被堆对象删除 解决方法:混合写屏障中:gc期间删除的对象标记为灰色

  • 对象被一个栈对象删除引用,成为另一个栈对象的下游 解决:弱三色不变式,栈上没有屏障,直接进行操作即可

  • 对象被一个堆对象删除引用,成为另一个堆对象的下游 解决:被删除的对象标记为灰色

  • 对象从一个栈对象删除引用,成为另一个堆对象的下游

混合写屏障最后记住四句话:

  • GC开始将栈上的对象全部扫描并标记为黑色(无需STW)

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

  • 被删除的对象标记为灰色

  • 被添加的对象标记为灰色

总结视频每次复习的时候看一遍

第14讲-总结哔哩哔哩bilibili

相关推荐
Java中文社群1 分钟前
Dify实战案例:MySQL查询助手!嘎嘎好用
java·人工智能·后端
程序猿阿伟5 分钟前
《深度探秘:Java构建Spark MLlib与TensorFlow Serving混合推理流水线》
java·spark-ml·tensorflow
TDengine (老段)13 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
键盘林16 分钟前
分布式系统简述
java·开发语言
可儿·四系桜17 分钟前
如何在 Java 中优雅地使用 Redisson 实现分布式锁
java·开发语言·分布式
bobz96523 分钟前
源码编译 libvirt
后端
道友小小怪24 分钟前
Spring Bean的生命周期及常见问题
后端·spring·面试
Java微观世界26 分钟前
让你秒懂字符集与编码:详解ASCII、GB2312、Unicode和UTF-8
后端
sszdzq32 分钟前
SpringCloudGateway 自定义局部过滤器
java·spring boot
消失的旧时光-194339 分钟前
Android 开发中配置 USB 配件模式(Accessory Mode) 配件过滤器的配置
android·java