golang采用三色标记法进行垃圾清理
GC过程分为标记过程和清理过程
产生错误的情况:
- 黑色对象引用白色对象
- 灰色对象到白色对象的引用被破坏
破坏这两个条件之一就可以避免错误情况的出现
可能的解决方法: 整个过程STW,浪费资源,且对用户程序影响较大,由此引入了屏障机制;
插入屏障解决的是第一种情况(黑色对象饮用白色对象),当黑色对象饮用白色对象时,将白色对象先变成灰色
删除屏障解决的是第二种情况,删除前,对指针所指对象进行着色
混合屏障:
大大缩短了 STW 时间
- GC 开始将栈上的对象全部扫描并标记为黑色;
- GC 期间,任何在栈上创建的新对象,均为黑色;
- 被删除的堆对象标记为灰色;
- 被添加的堆对象标记为灰色;
GC触发的机制:
- 主动触发
- 被动触发(百分比,定时)
百分比:将GC百分比设置为100意味着:基于在垃圾收集完成后标记为活动的堆内存量,下次垃圾收集前,堆内存使用可以增加100%
标签:黑色,标记,对象,golang,屏障,GC From: https://www.cnblogs.com/JujunWang/p/16909589.html