美文网首页
go语言 GC混合写屏障

go语言 GC混合写屏障

作者: __robin | 来源:发表于2021-04-15 12:38 被阅读0次

golang混合写屏障实现

  1. 写屏障只应用在堆上应用,栈上部启用。

  2. GC开始将栈上的对象全部扫描并标记为黑色。

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

  4. 被删除的对象标记为灰色。

  5. 被添加的对象标记为灰色。

golang gc流程

  1. STW(StopTheWorld)开启写屏障,记录数据段以及栈中roots的必要信息

  2. StartTheWorld开始标记,此时mutator(用户程序)和GC标记并发执行

  3. 标记完成再次STW,关闭写屏障

  4. StartTheWorld进入轻扫阶段


其中标记阶段有一个问题很多文章没有解释清楚,就是,栈上的黑色对象是否会引用到一个堆上的白色对象。因为栈是没有写屏障的,如果栈上的黑色对象引用了堆上的白色对象,被引用的白色对象就会被GC错误回收。
例如下图所示的场景:

golang gc.png
A如果引用了D,同事B删除了对D的引用,那么D不就被错误的回收了吗。

实际这种情况时不会发生的:

  1. 对于某个goroutine的栈扫描是原子的操作,会暂停此goroutine,标记结束后栈对象全部为黑色。
  2. 已被扫黑的栈,引用的堆上的对象至少是灰色。(比如C对象)。所以不可能发生同栈下引用改变会影响GC的问题,因为白色对象都在保护之中。
  3. 不可能发生上述的跨栈的引用。因为“对象不是从天上掉下来的”。因为A没有路径能够抵达D。
  4. GC期间栈上新建的对象全是黑色,即使逃逸到堆上,也是黑色,所以A如果引用了新创建的对象也会是黑色,而不会发生错误的回收

参考:
golang 垃圾回收(五)深入剖析混合写屏障
Golang三色标记+混合写屏障GC模式全分析
go: GC时写屏障与栈的引用变化

相关文章

  • go语言 GC混合写屏障

    golang混合写屏障实现 写屏障只应用在堆上应用,栈上部启用。 GC开始将栈上的对象全部扫描并标记为黑色。 GC...

  • Golang之GC

    参考 图解Golang的GC算法 搞懂Go垃圾回收 Golang垃圾回收 屏障技术

  • Golang垃圾回收机制

    原文链接 :[典藏版]Golang三色标记、混合写屏障GC模式图文全分析[https://www.jianshu....

  • Go语言——垃圾回收GC

    Go语言——垃圾回收GC 参考: Go 垃圾回收原理 Golang源码探索(三) GC的实现原理 Getting ...

  • go gc垃圾回收——三色标记、混合写屏障

    一、什么是GC 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自...

  • GO语言-GC

    引言 垃圾回收机制是高级语言常见的一类内存资源管理方式,C/C++这类语言内存分配及回收很大的主动权在调用者,gc...

  • 如何在Mac源码安装Go1.5开发环境

    到这里下载Go语言源码包。Go1.4到Go1.5是Go语言脱胎换骨的一次变更,The gc tool chain ...

  • Go 语言内存管理(三):逃逸分析

    介绍 Go 语言较之 C 语言一个很大的优势就是自带 GC 功能,可 GC 并不是没有代价的。写 C 语言的时候,...

  • 浅尝Go语言GC

    大家好,我是小栈君,因为个人和工作的缘故,所以拖更了一点时间,但是关于拖更的内容小栈君会在后续的时间中补回来,还希...

  • go-内存机制(4)

    go的GC机制 GO的GC是并行GC,也就是说GC的大部分清理和普通的go代码是同时运行的,这让GO的GC流程比较...

网友评论

      本文标题:go语言 GC混合写屏障

      本文链接:https://www.haomeiwen.com/subject/qbkdlltx.html