破坏条件1,这就是增量更新(Incremental Update)解决方案。
破坏条件2,这就是原始快照(Snapshot At The Beginning, SAT B )解决方案。
ZGC 采用的是增量更新解决方案。但是,增量更新不是新增吗,应该是写屏障啊,读屏障怎么做到呢?
其实新增一个引用时,之前肯定要从某处读到这个引用,那么这个读的操作便触发了读屏障。前面源码中,我们知道 ZGC 读屏障里有一个标记的过程,而且还会自动返回好指针,也就是说经过读屏障返回的指针中不存在白色对象,这就从根本上避免了条件1。
4、扩展思考
ZGC 标记是在指针上,而不是在对象上,当回收某个 region 时,对于此 region 里的某个对象,无法获得其他对象指向此对象的指针,那如何得知这对象是否存活呢?
这个问题需要我们将标记阶段和重分配阶段的代码连起来看才能得到答案了。
5、结束