三色标记法
Golang的三色标记法(Tri-color Marking)是一种用于垃圾回收(Garbage Collection, GC)的算法,它主要用于标记和回收不再使用的内存对象。该算法通过将对象分为三种颜色——白色、灰色和黑色,来追踪和确定哪些对象是可达的(reachable),哪些是不可达的(unreachable)即垃圾对象,从而进行回收。以下是关于Golang三色标记法的详细解释:
一、三色标记法的基本概念
三色标记法将对象分为以下三种颜色:
-
白色对象:潜在的垃圾对象,表示这些对象尚未被垃圾回收器访问到。在垃圾回收开始时,所有对象都被视为白色。当回收过程结束后,如果某些对象仍然保持为白色,则它们被认为是不可达的,即垃圾对象,可以被回收。
-
灰色对象:表示这些对象已被垃圾回收器访问到,但回收器还需要对其中的一个或多个指针进行扫描,因为它们可能还指向白色对象。灰色对象类似于一个“波面”,它们需要被进一步处理以确定其引用的对象是否可达。
-
黑色对象:表示这些对象已被垃圾回收器完全访问并扫描过,其中所有字段都已被检查。黑色对象中的任何一个指针都不可能直接指向白色对象,它们被认为是活跃的对象,不需要被回收。
二、三色标记法的执行过程
三色标记法的执行过程大致可以分为以下几个阶段:
-
标记准备阶段(Mark Setup):
- 在此阶段,垃圾回收器会进行一些准备工作,如启用写屏障(write barrier)等。写屏障是一种在对象引用发生变化时插入的额外操作,用于确保垃圾回收的正确性。
-
标记阶段(Marking):
- 从根对象(如全局变量、执行栈上的对象等)开始,将这些根对象标记为灰色,并放入待处理的灰色集合中。
- 从待处理的灰色集合中取出一个灰色对象,将其标记为黑色,并将其所有引用的白色对象标记为灰色,