GC roots
根对象在垃圾回收的术语中又叫做根集合,它是垃圾回收器在标记过程时最先检查的对象,包括:
全局变量:程序在编译期就能确定的那些存在于程序整个生命周期的变量。
执行栈:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。
寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。
三色标记法
- 白色对象 — 潜在的垃圾,其内存可能会被垃圾收集器回收;
- 黑色对象 — 活跃的对象,包括不存在任何引用外部指针的对象以及从根对象可达的对象;
- 灰色对象 — 活跃的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象;
三色不变性
想要在并发或者增量的标记算法中保证正确性,我们需要达成以下两种三色不变性(Tri-color invariant)中的一种:
- 强三色不变性 — 黑色对象不会指向白色对象,只会指向灰色对象或者黑色对象;
- 弱三色不变性 — 黑色对象指向的白色对象必须包含一条从灰色对象经由多个白色对象的可达路径
插入写屏障
插入写屏障会将有存活可能的对象都标记成灰色以满足强三色不变性。
将指针指向的新值置为灰色
删除写屏障
在老对象的引用被删除时,将白色的老对象涂成灰色,这样删除写屏障就可以保证弱三色不变性,老对象引用的下游对象一定可以被灰色对象引用。
混合写屏障
参考文章
- Go语言设计与实现-垃圾收集器
- [典藏版]Golang三色标记、混合写屏障GC模式图文全分析
- golang设计-垃圾回收
- legendtkl-Golang 垃圾回收剖析
- Golang中GC回收机制三色标记与混合写屏障
- Golang三色标记+混合写屏障GC模式全分析
- golang 垃圾回收(四)删除写屏障
- golang 垃圾回收(五)深入剖析混合写屏障
- Go 语言原本-写屏障技术
- 深度剖析 Golang 的 GC 扫描对象实现
- 自动的内存管理系统实操手册——Golang垃圾回收篇
https://making.pusher.com/golangs-real-time-gc-in-theory-and-practice/
https://blog.csdn.net/weixin_34248849/article/details/88987666
http://www.52codes.net/develop/shell/56961.html
https://www.cnblogs.com/badcw/p/14192895.html
https://weibo.com/ttarticle/p/show?id=2309404620360724382113#_loginLayer_1623600085589
https://weibo.com/ttarticle/p/show?id=2309404620723120373979
http://www.360doc.com/content/21/0416/22/15690396_972688492.shtml
https://www.cnblogs.com/saryli/p/10105393.html
https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md
https://talks.golang.org/2015/go-gc.pdf
https://www.luozhiyun.com/archives/475
https://www.oschina.net/translate/go-gc-solving-the-latency-problem-in-go-1-5?comments&p=1
https://www.jianshu.com/p/bfc3c65c05d1?utm_source=wechat_session
https://www.bilibili.com/video/BV1Ui4y1F7n3/?spm_id_from=333.788.recommend_more_video.0
https://xie.infoq.cn/article/67cfd494e6e10cd0b40de95ab
https://zhuanlan.zhihu.com/p/297177002
https://lessisbetter.site/2019/10/20/go-gc-1-history-and-priciple/
https://learnku.com/docs/go-blog/ismmkeynote/6499
https://tiancaiamao.gitbooks.io/go-internals/content/zh/06.2.html
https://www.bookstack.cn/read/GoExpertProgramming/chapter04-4.2-garbage_collection.md
https://docs.kilvn.com/go-internals/06.2.html
Garbage Collection Semantics - GopherCon SG 2019
https://medium.com/a-journey-with-go/go-memory-management-and-memory-sweep-cc71b484de05
https://medium.com/a-journey-with-go/go-how-does-the-garbage-collector-mark-the-memory-72cfc12c6976
https://medium.com/a-journey-with-go/go-keeping-a-variable-alive-c28e3633673a
https://www.tyx.pub/archives/148
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
https://talks.golang.org/2015/go-gc.pdf
https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md
https://github.com/golang/proposal/blob/master/design/11970-decentralized-gc.md
https://github.com/golang/proposal/blob/master/design/44167-gc-pacer-redesign.md
https://github.com/golang/proposal/blob/master/design/12800-sweep-free-alloc.md