三色标记算法的数据结构中包含有三个集合:White Set, Black Set 和 Gray Set。
白色集合对象:需要被回收的对象。
黑色集合对象:没有对白色集合对象的外部引用,并且是 GC Root 可达的对象。这些对象将不会被回收。
灰色集合对象:集合中的对象全都是 GC Root 可达的对象,但是正在扫描或正在等待扫描其对“白色集合对象”的引用,这些对象也不会被回收,并且会在扫描结束之后被移入黑色集合。
算法步骤:
(0)初始化:
在大多数算法实现中,黑色集合初始是空,灰色集合中保存有与 GC Roots 对象直连的所有老年代对象,白色集合中包含有其他对象。
内存中的任意对象在任意时间都仅存在于这三个集合当中的一个。
(1)从灰色集合中取出一个对象放入黑色集合
(2)遍历第 1 步取出的对象的所有白色集合对象引用,并将它们移入灰色集合。这保证了这个对象和它的引用对象都不会被 GC
(3)重复上述两步,直到灰色集合为空
由于非 GC Root 直接可达的节点都被加入到了 White Set,并且对象只能从白色集合移动到灰色集合,从灰色集合移动到黑色集合,所以算法体现了一个重要特性——黑色集合中的对象不会引用到白色集合中的对象。这就保证了在灰色集合为空时,我们可以放心地释放白色空间中的对象。这被称作三色不变式(The Tri-color Invariant)。
作者:classtag 链接:https://www.jianshu.com/p/2329d1c43ceb 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。