扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
《Go语言程序设计》是2013年人民邮电出版社出版的图书,作者是Mark。作者展示了如何编写充分利用Go语言突破性的特性和惯用法的代码,以及Go语言在其他语言之上所做的改进,并着重强调了Go语言的关键创新。
创新互联建站主营长岛网站建设的网络公司,主营网站建设方案,APP应用开发,长岛h5重庆小程序开发公司搭建,长岛网站营销推广欢迎长岛等地区企业咨询
最近在看左神新书 《Go 语言设计与实现》的垃圾收集器时产生一个疑惑,花了点时间搞清楚了记录一下。
Go 语言垃圾回收的实现使用了标记清除算法,将对象的状态抽象成黑色(活跃对象)、灰色(活跃对象中间状态)、白色(潜在垃圾对象也是所有对象的默认状态)三种,注意没有具体的字段标记颜色。
整个标记过程就是把白色对象标黑的过程:
1.首先将 ROOT 根对象(包括全局变量、goroutine 栈上的对象等)放入到灰色集合
2.选一个灰色对象,标成黑色,将所有可达的子对象放入到灰色集合
3.重复2的步骤,直到灰色集合中为空
下图是书上的插图,看上去是一个典型的深度优先搜索的算法。
下图是刘丹冰写的《Golang 修养之路》的插图,看上去是一个典型的广度优先搜索的算法。
我疑惑的点在于这个标记过程是深度优先算法还是广度优先算法,因为很多文章博客对此都没有很清楚的说明,作为学习者这种细节其实也不影响对整个 GC 流程的理解,但是这种细节我非常喜欢扣:)
对着书和源码摸索着大致找到了一个结果是深度优先。下面看下大致的过程,源码基于1.15.2版本:
gcStart 是 Go 语言三种条件触发 GC 的共同入口
启动后台标记任务
为每个处理器创建用于执行后台标记任务的 Goroutine
上面休眠的 G 会在调度循环中检查并唤醒执行
执行标记
gcw 是每个 P 独有的所以不用担心并发的问题 和 GMP、mcache 一样设计,减少锁竞争
尝试在全局列表中获取一个不为空的 buf
这是官方实现的无锁队列:)涨见识了,for 循环加原子操作实现栈的 pop
到这里从灰色集合中获取待扫描的对象逻辑说完了。找到对象了接着就是 scanobject(b, gcw) 了,里面有两段逻辑要注意
根据索引位置找到对象进行标色
尝试存入 gcwork 的缓存中,或全局队列中
无锁队列,for 循环加原子操作实现栈的 push
到这里把灰色对象标黑就完成了,又放回灰色集合接着扫下一个指针。
Go 语言设计与实现 垃圾收集器
Golang三色标记+混合写屏障GC模式全分析
《Go程序设计语言中文版》百度网盘pdf最新全集下载:
链接:
?pwd=0cii 提取码:0cii
简介:本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队主管Alan Donovan联袂撰写,是学习Go语言程序设计的指南。本书共13章,主要内容包括:Go的基础知识、基本结构、
基本数据类型、复合数据类型、函数、方法、接口、goroutine、通道、共享变量的并发性、包、go工具、测试、反射等。
本书适合作为计算机相关专业的教材,也可供Go语言爱好者阅读
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流