C/C++教程

聊聊Garbage Collector的SATB

本文主要是介绍聊聊Garbage Collector的SATB,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  序

  本主要研究一下Garbage Collector的SATB

  CMS、G1、Shenandoah在进行concurrent marking的都采用了SATB的技术

  Shenandoah

  Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有

  Snapshot-at-the-beginning concurrent mark包括Init Mark(Pause)、Concurrent Mark、Final Mark(Pause)Concurrent evacuation(这个阶段用到了Brooks Pointers(object version change with additional atomically changed indirection)进行copy)Concurrent update references (optional)包括Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause)

  Shenandoah在进行concurrent marking的时候采用了SATB的技术

  SATB

  SATB全称为Snapshot At The Beginning,其要点如下:

  mark的过程就是遍历heap标记live object,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,然后再标记gray为black;遍历完成之后所有可达对象都是black的,所有white都是可以回收的SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start),但是concurrent的时候并发修改可能造成对象漏标记,比如对black新引用了一个white对象,然后又从gray对象中删除了对该white对象的引用,这样会造成了该white对象漏标记对black新引用了一个white对象,然后从gray对象删了一个引用该white对象的white对象,这样也会造成了该white对象漏标记对black新引用了一个刚new出来的white对象,没有其他gray对象引用该white对象,这样也会造成了该white对象漏标记对于三色算法在concurrent的时候可能产生的漏标记问题,SATB在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;由于是在开始的时候进行snapshot,因而可能存在Floating Garbage

  小结

  CMS、G1、Shenandoah在进行concurrent marking的时候都采用了SATB的技术;SATB concurrent mark便是Shenandoah GC的第一个cycle遍历heap标记live object,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,然后再标记gray为black;遍历完成之后所有可达对象都是black的,所有white都是可以回收的SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start);在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;由于是在开始的时候进行snapshot,因而可能存在Floating Garbage

这篇关于聊聊Garbage Collector的SATB的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!