美文网首页
垃圾回收之写屏障

垃圾回收之写屏障

作者: 小小青蛙不怕风吹雨打 | 来源:发表于2020-07-07 23:47 被阅读0次

资料阅读

有两张不错的gif图(源自wikipedia) https://zhuanlan.zhihu.com/p/74853110
最先看的文章,引用了上面的文章 https://www.jianshu.com/p/4c5a303af470
在讨论 Go 的混合写屏障 https://github.com/changkun/go-under-the-hood/issues/20
解释了为啥有 read barrier https://www.zhihu.com/question/42879518/answer/437304734

这些个文章看完,总觉得其中对golang的混合写屏障没说透,甚至感觉有错误说法。

三色标记的理解

基本的mark-sweep算法

基本算法有个缺点,需要STW(stop the world),有较大延时。

三色标记法(tricolor mark-sweep)

三色标记的过程中,节点颜色变化:白色》灰色》黑色。当没有灰色了,标记结束,黑色存活,白色清除。
三色标记可以实现增量回收和并发回收,能降低延时(latency);当然也有缺点,会降低吞吐量(throughput)。

三色标记正确运行需要满足下面2个条件中的一个:

  1. 强三色不变式:黑色对象不引用白色对象。
  2. 弱三色不变式:黑色对象引用的白色对象可以通过灰色对象搜索到。

当使用增量回收和并发回收时,回收过程中,用户程序会新建对象修改对象引用,会破坏上面的条件。写屏障就是为了处理这个事情。
有两套方案

// 当obj是黑色时,标记插入的*prt对象至少为灰色。满足强三色条件
// GC运行时,新new出来的对象,可以直接标记成黑色。
djjkstra_write_barrier(obj, ref, ptr){
    shade(ptr) // shade的做法时如果是白色就标记成灰色,否则不变。后面的伪代码都是这个意思。
    ref = ptr
}

// 从obj上删除ref时,标记*ref至少为灰色。这样可以满足弱三色条件
// 悲观认为所有被删的对象都可能被黑色对象引用了,效率很低的样子。
// **注意:**GC运行时,新new出的对象必须直接标记成黑色
yuasa_write_barrier(obj, ref, ptr){
    shade(ref) // 当obj时黑色时,可以不标记,因为删掉黑色到白色之类引用关系不破坏弱三色条件
    ref = ptr
}

一般来说dijk就挺好的,但像golang这种希望写栈上的引用时不使用写屏蔽,提高性能,所以得找别的方法。

  1. golang早期用的dijk的方法,得把栈本身重新标记成灰色,mark的最后阶段STW,然后扫描下栈,完成标记。这样说是最后结算的延时可以达到100ms。
  2. golang 1.8 用yuasa的方法,也同样存在同样的问题。这时可以当栈还不是黑色时,所有复制操作,额外把ptr标记成灰色,就当是从栈里删除下来的。
    伪代码
// golang 1.8的方式,说法是结合了dij和yuasa。效率(吞吐量)比yuasa还低。
// **注意:**GC运行时,新new出的对象必须直接标记成黑色
golang_hybird_write_barrier(obj, ref, ptr){
    shade(ref)
    // 当栈本身还没完成扫描时,假定ptr就是从栈上删除取下来的对象。当栈扫描完,可以当成标记为黑色,这时就不需要补充标记了。
    if current stack is grey: 
        shade(ptr)
    ref = ptr
}

这样就可以实现,栈里面的写操作不需要barrier处理,扫描最后也不需要STW重新扫描栈。

相关文章

  • 垃圾回收之写屏障

    资料阅读 有两张不错的gif图(源自wikipedia) https://zhuanlan.zhihu.com/p...

  • Golang之GC

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

  • 深入Java底层:GC

    概述 下文主要分为以下几个大模块进行JVM的GC解读: 垃圾回收之标记算法 垃圾回收之回收算法 堆内存年轻代垃圾收...

  • 初步学习JVM底层原理(二)

    Java之JVM垃圾回收 内存结构以及垃圾回收算法 作为Java语言的核心之一,JVM垃圾回收帮我们解决了让我们很...

  • Golang GC算法

    概括 Go的垃圾回收官方形容为 非分代 非紧缩 写屏障 三色并发标记清理算法。非分代:不像Java那样分为年轻代和...

  • 浅谈下垃圾回收机制(1)

    前言:垃圾回收机制在工作中很少碰到,看到阮一峰的书中有写,记录下。 垃圾回收机制与WeakSet(1)垃圾回收机制...

  • Java 垃圾回收器之G1详解

    Java 垃圾回收器之G1详解 概述 G1垃圾回收器是在Java7 update 4之后引入的一个新的垃圾回收器。...

  • 三色标记法与读写屏障

    前言 本文主要介绍了三色标记法的基本思路、多标导致的浮动垃圾、漏标的处理方案(读写屏障)等。 1. 垃圾回收的简单...

  • 一图在手🚮垃圾分类不再愁

    【思维导图实战派】刻意练习之“遇见...”计划:236/300 可回收垃圾 可回收垃圾主要包括废纸、塑料、玻璃、金...

  • 简单理解垃圾回收

    什么是垃圾回收? 垃圾回收的是什么? 如何判断为垃圾? 垃圾是怎样被回收的? 垃圾回收哪些区域的内存? 什么是垃圾...

网友评论

      本文标题:垃圾回收之写屏障

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