判断哪些对象需要被垃圾回收?引用计数会导致循环引用,所以一般都是可达性分析。
可达性分析是从GC Root出发,进行三色标记算法。CMS就是使用标记清除算法,整个过程就是一个三色标记流程。
初始标记 STW,标记GC ROOT为黑色, GC ROOT关联的为灰色
并发标记 扫描整个引用链,没有子节点为黑,有子节点为灰色
重标记 STW 修复变动的
并发清除 开始正式清除,清除白色的
三色标记的遗留问题:多标 or 漏标
多标下次垃圾回收就解决了,漏标。只能设置读写屏障了。
漏标的发生条件:
1.黑色重新引用白色对象。
2.灰色断开白色引用
1.读屏障是,将该白色对象记录下来。直接变为灰色,重标记的时候继续标记。
2.写屏障,其中两种方法就是
Incremental Update 将新增引用保存下来,下次继续遍历。破坏第一个漏标条件
SATB 把旧的引用记录下来,相对于快照。下次继续遍历。破坏第二个漏标条件