@coffeebeansyy 降低停顿时间是一个很笼统的大概念,G1很多手段都是为了降低STW时间,比如引入了空间置换时间的 RSet,SATB本身解法也算是一种思路,区别于CMS增量 write barrier。CMS为了维持对象图变化才引入了post-write barrier 记录新引用关系的变化,这个维护成本很大,并且致命问题是,无法持续跟踪堆外根集变化,这样一来,remark阶段就需要重新扫描整个 GC Roots,新生代以及寄存器,too expensive,在处理大堆的时候很可能严重影响停顿时间;SATB跟CMS 增量barrier完全是另一套思路,关注的是引用关系的删除,使用的是pre-write barrier,在删除/变更 引用关系之前把旧值(old value)记录下来,对于在并发标记期间删除/变更的引用关系的旧值会记录下来,并且让引用指向的对象存活过此次GC,即使这个对象有可能并非存活,也只是多了些float garbage而已,在remark阶段也不需要重新扫描所有GC roots了,因为只要是新生成的对象,都视为alive。虽然两者remark阶段同为STW,但是实质上处理的事情和延时可能会有本质的区别,尤其是面对大堆的时候。
G1垃圾收集器之SATB简书 占小狼转载请注明原创出处,谢谢! openjdk下载 传送门 对象漏标 垃圾回收的并发标记阶段,gc线程和应用线程是并发执行的,所以一个对象被标记之后,应用线程可能篡改...