what:
SATB全称Snapshot-At-The-Beginning,字面意思是:GC开始时活着对象的一个快照。它是通过root tracing得到的,作用是保持并发GC的正确性。
具体如何确保并发GC正确性?三色标记法(和CMS的一样)。
why:
三色标记法,是会产生漏标问题。具体是:白色对象接到黑色对象上,并且所有灰色对象到白色对象的引用全部丢失。
how:
在GC开始时,先创建一个对象快照。快照中所有当时活的对象在并发标记时,都认为是活得的,并且并发标记过程中的所有新建的对象都认为是活的。
SATB有2个重要的Bitmap,分别是:prevBitmap和nextBitmap。2个Bitmap存储在每个region中,并且还配合有2个重要的变量,分别是:preTAMS(pre-top-at-mark-start,代表本region上次完成标记的位置)和nextTAMS(next-top-at-mark-start,随着标记不断向后移动,开始在top位置)。SATB通过控制这两个变量来进行 标记,具体规则如下:
a、假设第n轮标记开始,将该region的top指针赋值给nextTAMS。在并发标记期间,所有分配的对象都会存在在[nextTAMS,top],SATB可以确保所有对象都是活的;
b、并发标记结束时,将nextTAMS赋值给preTAMS,SATB会给[bottom,preTAMS]创建一个快照Bitmap,则所有的垃圾对象都可以通过该bitmap找到;
c、第n+1轮并发标记,和第n轮一样;
A阶段,初始标记阶段,通过STW,将region的top赋值给nextTAMS;
A-B阶段,并发标记阶段;
B阶段,是并发标记结束阶段。并发标记阶段生成的新对象都会放在[nextTAMS,top]之间,这边对象被定义为“隐式对象”,同时nextBitmap也记录了bottom到nextTAMS之间标记对象的地址;
C阶段,是垃圾清理阶段。会交换prevBitmap和nextBitmap,同时清理[bottom, preTAMS]之间标记后的垃圾,对应的“隐式对象”,在下个阶段才会被标记清理。