CMS并发标记出现引用变化的场景

why:

  并发标记标记阶段,应用线程是在run的,就会是并发标记的结果不准,漏垃圾还好,主要是把一下需要使用的对象清理了。

 

where:

  如下图:

CMS并发标记出现引用变化的场景

 

  并发标记线程在扫描完A后。应用线程将C的引用关系,经过b转换到了c。这时由于A已经扫描(三色扫描)完毕了,不会再扫描标记A,那么C对象就会最终标记为白色(垃圾),实际C是有用的。

 

how:

  引入write bariier,write bariier在改写引用时,会额外的判断赋值对象是否被扫描标记过没有。如果没有,就把它压入标记栈中。引入write bariier的操作后,内存图就如下面:

CMS并发标记出现引用变化的场景

 

上一篇:终于把CMS垃圾收集器搞懂了~


下一篇:垃圾收集器