专栏首页码匠的流水账聊聊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

doc

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊rocketmq的DLedgerRoleChangeHandler

    本文主要研究一下rocketmq的DLedgerRoleChangeHandler

    codecraft
  • 聊聊rocketmq的DLedgerRoleChangeHandler

    本文主要研究一下rocketmq的DLedgerRoleChangeHandler

    codecraft
  • 聊聊rocketmq的ConsumeFromWhere

    rocketmq-common-4.5.2-sources.jar!/org/apache/rocketmq/common/consumer/ConsumeFr...

    codecraft
  • 一文读懂SpringMVC工作流程

    本文是对 SpringMVC 工作流程的总结,这是前段时间苏宁Java工程师在线笔试的简答题,自己一定要可以用语言描述SpringMVC的工作流程。

    Wizey
  • 全面分析Java的垃圾回收机制

    【简 介】 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过...

    bear_fish
  • Linux C程序真的不能访问NULL指针吗?

    本文将介绍如何对NULL指针地址建立合法映射,从而合法访问NULL指针。本文表达的宗旨:

    Linux阅码场
  • SpringMVC工作流程

    DispatcherServlet:前端控制器,是 SpringMVC 工作流程的中心,负责调用其他组件,在系统启动时就加载该类。

    Java天坑
  • C# HTTP系列10 form表单的enctype属性

    在ASP.NET编程中经常遇到下面的代码片段,将人员信息以表单方式提交到后台程序并保存到服务器与数据库中。

    张传宁老师
  • 数据告诉你:跟缺“芯”相比,中国当前的这个问题更致命!

    导读:近期,中美贸易摩擦引发各方关注,尤其是美国商务部对中兴通讯7年的销售禁令在业内引发普遍的悲观和焦虑。不过,也有不同的观点认为,缺“芯”问题导致的后果并没有...

    华章科技
  • 其实学 Java 就这两样东西!

    Java技术栈

扫码关注云+社区

领取腾讯云代金券