wordpress 5.0主题,wordpress seo.php,私人让做彩票网站吗,乐山网站建设流程go v1.3的标记清除法
清除的第一步#xff1a;stw将可达对象标记删除未被标记对象 go v1.5三色标记法
从根节点出发#xff0c;将下一个节点遍历为灰色#xff0c;放入灰色集合中遍历灰色节点集合#xff0c;把灰色能到达的节点标记为灰色#xff0c;把自身标记为黑色stw将可达对象标记删除未被标记对象 go v1.5三色标记法
从根节点出发将下一个节点遍历为灰色放入灰色集合中遍历灰色节点集合把灰色能到达的节点标记为灰色把自身标记为黑色放入黑色集合中重复上述流程 …把最终剩余的白色对象进行清楚 会出现对象丢失问题例子如下
对象2 引用 对象3对象4 引用 对象3 —— 对象4 引用 3 可以在进行gc期间启动stw这样就不会出现问题但是stw有明显的资源浪费。可以通过强弱三色不变式的思路来解决对象丢失问题
强三色不变式黑色对象不能引用白色对象
弱三色不变式黑色对象可以引用白色对象但是白色对象存在上游对象
对于强三色不变式的实现通过插入写屏障机制实现只在栈空间启用在A对象引用B对象时候若B对象为白色就把它标记为灰色。
注意栈空间不启用插入写屏障还会造成对象丢失问题因为栈空间一个黑色对象新创建了一个白色对象时候若没有插入写屏障会造成白色对象丢失
所以在最终准备回收白色前启动stw重新扫描一次栈空间重新标记避免对象丢失 对于弱三色不变式的实现通过删除写屏障实现在对象A取消对对象B的引用时候会把B对象标记为灰色。 上面是通过插入写屏障和删除写屏障来避免对象丢失问题。会有两个问题
插入写屏障的不足准备回收白色对象垃圾时候需要stw
删除写屏障的不足回收精度低删除一个对象需要下一轮才能删除
于是go语言就引入了混合写屏障。
go v1.8 三色标记法 混合写屏障
GC开始将栈上的对象全部扫描并标记为黑色GC期间任何在栈上创建的新对象均为黑色被删除的对象标记为灰色被添加的对象标记为灰色
前两步避免了事后的栈空间的stw。后两步结合了删除写屏障和插入写屏障。