golang GC小记

写屏障 和 读屏障

就是在底层关联对象的时候设置的hook钩子,

在分配或者释放内存的时候的hook就是写屏障

在读取内存的时候的hook就是读屏障

golang里面都是使用的写屏障

插入写屏障和删除写屏障

在引用对象时的hook就是插入写屏障

在取消引用对象时的hook就是删除写屏障

go在并发运行时,大部分的操作都发生在栈上,函数调用会非常频繁。数十万goroutine的栈都进行写屏障性能问题非常大,基本不可行。

v1.5使用的是插入写屏障,由于栈是没有插入写屏障,那么就可能会存在在GC过程中栈上黑色对象引用白色的对象的情况。所以完成三色遍历后,需要单独对栈进行一次STW,rescan。

v1.8 采用的是混合写屏障

你可以理解为 插入写屏障和删除写屏障 混合存在

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

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

堆上被删除的对象标记为灰色 (删除写屏障)

堆上新添加的对象标记为灰色 (插入写屏障)

相关推荐
符华-7 小时前
【Go】excelize库实现excel导入导出封装(四),导出时自定义某一列或多列的单元格样式
golang·excel
ether-lin7 小时前
开发个人Go-ChatGPT--1 项目介绍
chatgpt·golang·ollama·openui
ether-lin7 小时前
开发个人Go-ChatGPT--3 服务拆分
chatgpt·golang·llama·go-zero
海风极客11 小时前
工作两年后,我如何看待设计模式
开发语言·后端·设计模式·golang·编程思维
给朕把屎铲了18 小时前
golang编译成Linux可运行文件
linux·开发语言·golang
Ivanqhz19 小时前
加法器的基本操作
java·大数据·数据库·hadoop·golang
xidianhuihui19 小时前
go-redis源码解析:如何实现sentinel高可用
redis·golang·sentinel
绝迹之春20 小时前
golang与以太坊交互
开发语言·golang·区块链·交互
959y1 天前
[Go 微服务] Kratos 使用的简单总结
开发语言·golang·kratos
装B且挨揍の1 天前
golang实现网卡流量监控
开发语言·golang·xcode