写屏障 和 读屏障
就是在底层关联对象的时候设置的hook钩子,
在分配或者释放内存的时候的hook就是写屏障
在读取内存的时候的hook就是读屏障
golang里面都是使用的写屏障
插入写屏障和删除写屏障
在引用对象时的hook就是插入写屏障
在取消引用对象时的hook就是删除写屏障
go在并发运行时,大部分的操作都发生在栈上,函数调用会非常频繁。数十万goroutine的栈都进行写屏障性能问题非常大,基本不可行。
v1.5使用的是插入写屏障,由于栈是没有插入写屏障,那么就可能会存在在GC过程中栈上黑色对象引用白色的对象的情况。所以完成三色遍历后,需要单独对栈进行一次STW,rescan。
v1.8 采用的是混合写屏障
你可以理解为 插入写屏障和删除写屏障 混合存在
GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),
GC期间,任何在栈上创建的新对象,均为黑色。
堆上被删除的对象标记为灰色 (删除写屏障)
堆上新添加的对象标记为灰色 (插入写屏障)