学习记录:垃圾收集器--CMS和G1

关于三色标记算法

白色:初始阶段所有的对象都是白色。在可达性分析后如果还是白色就表示可以被回收。

灰色:垃圾收集器扫描过该对象,但这个对象还有至少一个引用没有被扫描过

黑色:垃圾收集器扫描过该对象,且扫描过这个对象的所有引用。黑色代表这个对象被扫描过,且是存活的,如果有其他对象引用指向黑色对象,则无需重新扫描。黑色对象不可直接指向某个白色对象。一个对象只有被黑色对象引用才能存活。

上面这个图展示了GC线程标记后用户线程又修改了引用关系。上面的情况是:灰色对象1到白色对象3的引用被切断。同时已经扫描过的黑色对象2建立了和白色对象3的关系。这种情况非常危险,因为黑色对象2不会被重新扫描,导致实际存活的对象3被认为是死亡。

在1994年Wilson在理论上证明了,当且仅当以下两个条件同时满足时,会产生“对象消失”的问题,即:应该是黑色的对象被误标记为白色。

  1. 赋值器插入了一条或多条从黑色对象到白色对象的新引用
  2. 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用

因此要解决并发标记时对象消失问题,只需要破坏这两个条件的任意一个即可。由此产生了两个方案:

  1. 增量更新(Incremental Update):破坏第一个条件。当黑色对象被插入指向白色对象的引用关系时,就将黑色对象记录下来,等并发标记结束之后,再以黑色对象为根重新扫描。也可以简单理解为:只要被插入指向白色对象的引用,黑色对象就变成了灰色对象。
  2. 原始快照(Snapshot At The Begining):破坏第二个条件。当灰色对象要删除指向白色对象的引用关系时,将这个引用关系记录下来。在并发标记结束之后,再以这些记录下来的引用关系中的灰色对象为根,重新扫描一次。可以简化理解为:在引用关系删除的那一刻,将引用关系以快照的方式存下来 ,之后再进行搜索。

CMS使用的是增量更新;G1使用的是原始快照。

经验分享 程序员 微信小程序 职场和发展