介绍
三色三色,就是将对象分为黑色、灰色和白色。三种颜色代表对象不同的状态,黑色表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过;灰色表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描;白色表示对象尚未被垃圾收集器访问过(对象没有被任何对象引用);垃圾回收就是将标记为白色的对象回收。三色标记的原理就是这样,那么这样标记看似很准确,但是如果在并发环境下,却非常容易出现错误。
在并发环境下,用户进程也在同时进行,假如有这种情况,在标记完成后,黑色灰色白色已经标记完成,但是这个时候用户进程说,这个标记为白色的对象我要用,或者用户进程里修改了引用链上的引用,导致其引用链发生变化,这个时候对于原先的对象颜色标记就会出现问题,这个问题有个专业词,叫“对象消失”。如何处理这类问题呢,CMS采用了Incremental Update(增量更新)的算法。
三色标记如果是在用户进程暂停的时间内进行是没有问题的!
图示
关于三色标记出现的错误我用书中的图来记录下,更形象: