Go语言的垃圾回收机制是其内存管理的关键组成有些,而三色标记法是Go GC的核心算法之一。
三色标记法概述
三色标记法是一种基于根追踪的垃圾回收算法。它将对象分为三种颜色,以帮垃圾回收器识别和回收不再需要的对象。
三种颜色
- 白色代表尚未被扫描的对象,兴许是垃圾也兴许是存活对象。
- 灰色代表Yi经访问过的对象,它们至少许有一个引用来自白色对象,但自身兴许还有其他引用。
- 黑色代表Yi经确认可达的对象,它们至少许有一个引用来自黑色对象。
标记过程
- 初始标记从根集合开头,将全部根对象标记为灰色。
- 并发标记垃圾回收器会并发地遍历灰色对象, Ru果找到白色对象,将其标记为灰色;Ru果找到黑色对象,则跳过。
- 沉新鲜标记为了处理并发标记过程中兴许出现的白色对象, 垃圾回收器会进行一次飞迅速扫描,将新鲜找到的白色对象标记为灰色。
- 清除阶段将全部白色对象视为垃圾进行回收。
三色不变式
为了保证垃圾回收的正确性, 三色标记法依赖于以下两个不变式:
- 有力三色不变式Ru果一个对象是黑色的,则它不Neng引用随便哪个白色对象。
- 没劲三色不变式Ru果一个对象是白色的,则它不Neng被随便哪个黑色对象引用。
写屏障
为了维护三色不变式, Go用了写屏障机制:
- 插入写屏障当对象被标记为灰色时随便哪个对该对象的写操作dou会通过写屏障来记录。
- 删除写屏障当对象被标记为黑色时随便哪个对该对象的引用删除操作dou会通过写屏障来记录。
- 混合写屏障结合插入和删除写屏障的优良处。
三色标记法是Go GC的核心算法, 使得Go语言Neng够有效地管理内存,少许些内存泄漏和性Neng问题。