关于JVM的在可达性分析中的三色计数器

93 阅读2分钟

三色标记法,就是把遍历对象图过程中遇到的对象,按照 “是否访问过” 这个条件标记成以下三种颜色:

  • 白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达(可达性分析到不了的对象,就是死亡对象,需要被回收)
  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍。黑色对象不可能直接(不经过灰色对象)指向某个白色对象。
  • 灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过
  • 所以对象图遍历的过程,其实就是由灰色从黑向白推进的过程,灰色是黑和白的分界线。
  1. 浮动垃圾:所谓浮动垃圾,就是由于垃圾收集和用户线程是并行的,这个对象实际已经死亡了,已经没有其他人引用它了,但是被垃圾收集器错误地标记成了存活对象。

  2. 对象消失:对象消失和浮动垃圾恰恰相反,对象消失是把原本存活的对象错误标记为已消亡(原本应该是黑色的对象被误标为白色),产生对象消失问题需要满足两个条件:

  • 插入了一条或多条从黑色对象到白色对象的新引用
  • 删除了全部从灰色对象到该白色对象的直接或间接引用

对象消失是一个很致命的问题,程序肯定会因此发生错误,所以 “对象图遍历” 这个阶段最好是进行 STW 的,但是这个阶段的时间又很长,所以我们需要想出一些办法来解决对象消失问题,使得在遍历对象图的过程中不用进行 STW(也就是用户线程和对象线程可以同时工作),从而提升可达性分析的效率。