专栏首页码匠的流水账聊聊ShenandoahGC的Brooks Pointers
原创

聊聊ShenandoahGC的Brooks Pointers

本文主要研究一下ShenandoahGC的Brooks Pointers

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)

其中Final Mark或者Final update Refs之后都可能进行Concurrent cleanup,进行垃圾回收,reclaims region

Brooks Pointers

G1 GC在evacuation阶段是parallel的,但不是concurrent,ShenandoahGC为了做到concurrent copy使用了Brooks Pointers。

Rodney A. Brooks在<<Trading Data Space for Reduced Time and Code Space in Real-Time Garbage Collection on Stock Hardware>>这篇论文提出了一种使用forwarding pointer来做到concurrent copy的方案,该方案在所有对象的内存结构上新增一个forwarding pointer,它要么指向对象自己,要么指向在to-region的自己的拷贝

其要点如下:

  • evacuation的第一步是拷贝from-region的对象到to-region
  • evacuation的第二步使用CAS改变from-region的对象的forwarding pointer由自己变为指向to-region的拷贝对象
  • evacuation的第三步就是遍历heap,更新引用到to-region的拷贝对象

如果在evacuation期间,其他线程通过旧的引用访问到了from-region的旧对象,它就需要根据旧对象的forwarding pointer找到to-region的拷贝对象;等所有旧对象的引用都更新完之后,后续就可以回收from-region的旧对象

示例代码

concurrent copy

class VersionUpdater<T, V> {
    final AtomicReference<T> ref = ...;
    void writeValue(V value) {
        do {
            T oldObj = ref.get();
            T newObj = copy(oldObj);
            newObj.set(value);
        } while (!ref.compareAndSet(oldObj, newObj));
    }
}

这里使用do while循环,即先拷贝再进行CAS,如果CAS不成功则继续尝试拷贝和CAS

write barriers

stub Write(val, obj, offset) {
    if (evac-in-progress && // in evacuation phase
        in-collection-set(obj) && // target is in from-space
        fwd-ptrs-to-self(obj)) { // no copy yet
        val copy = copy(obj);
        *(copy + offset) = val; // actual write
        if (CAS(fwd-ptr-addr(obj), obj, copy)) {
            return; // success!
        }
    }
    obj = fwd-ptr(obj); // write to actual copy
    *(obj + offset) = val; // actual write
}

在evacuation阶段,对from-region的对象的写操作会触发该对象的evacuation操作(如果该对象在to-region还没有copy的话)

evacuation

stub evacuate(obj) {
    if (in-collection-set(obj) && // target is in from-space
        fwd-ptrs-to-self(obj)) { // no copy yet
        copy = copy(obj);
        CAS(fwd-ptr-addr(obj), obj, copy);
    }
}

evacuate先判断该对象是否在from-region且在to-region还没有copy,如果满足条件则进行拷贝,然后CAS修改旧对象的forwarding pointer指向拷贝对象

小结

  • Shenandoah面向low-pause-time的垃圾收集器,它在Concurrent evacuation阶段用到了Brooks Pointers(object version change with additional atomically changed indirection)进行copy,以实现concurrent copy
  • Rodney A. Brooks在<<Trading Data Space for Reduced Time and Code Space in Real-Time Garbage Collection on Stock Hardware>>这篇论文提出了一种使用forwarding pointer来做到concurrent copy的方案,该方案在所有对象的内存结构上新增一个forwarding pointer,它要么指向对象自己,要么指向在to-region的自己的拷贝
  • evacuation的第一步是拷贝from-region的对象到to-region;evacuation的第二步使用CAS改变from-region的对象的forwarding pointer由自己变为指向to-region的拷贝对象;evacuation的第三步就是遍历heap,更新引用到to-region的拷贝对象

doc

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

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

登录 后参与评论
0 条评论

相关文章

  • JDK12 ShenandoahGC小试牛刀

    当allocation failure发生的时候,Shenandoah有一些优雅的degradation ladder用于处理这种情况,如下:

    code4it
  • Java12的新特性

    对于需要返回值的switch expression要么正常返回值要么抛出异常,以下这两种写法都是错误的

    code4it
  • Java12的新特性

    对于需要返回值的switch expression要么正常返回值要么抛出异常,以下这两种写法都是错误的

    code4it
  • 深入理解JVM(③)低延迟的Shenandoah收集器

    Shenandoah作为第一款不由Oracle(包括一起的Sun)公司的虚拟机团队所领导开发的HotSpot垃圾收集器。是只存在于OpenJDK当中的,最初由R...

    纪莫
  • 恐惧与夸张?来源于那些不在AI领域工作的人?

    在大部分人眼里,人工智能(AI)非常神秘,其实一点都不然。也许你每天都遇到它,尽管你并不知道。你的行动帮助它成长,然而你很少再去想它。人工智能就在你的口袋里,在...

    机器人网
  • 小白前端入门笔记(21),表单里如何添加单选按钮?

    大家好,欢迎来到freecodecamp HTML专题第21篇,我们今天来聊聊单选按钮的使用。

    TechFlow-承志
  • ​LeetCode刷题实战117:填充每个节点的下一个右侧节点指针 II

    https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/

    程序IT圈
  • 三面字节跳动后面试总结-(研发端面经)

    算法题:binary tree 每层找最大值:level order traversal(BFS)

    烂猪皮
  • ​LeetCode刷题实战116:填充每个节点的下一个右侧节点指针

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就...

    程序IT圈
  • 聊聊storm的WindowedBolt

    storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

    code4it
  • 聊聊flink的ListCheckpointed

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/chec...

    code4it
  • 聊聊storm的LinearDRPCTopologyBuilder

    storm-2.0.0/storm-client/src/jvm/org/apache/storm/drpc/LinearDRPCTopologyBuilder...

    code4it
  • 聊聊flink的CsvReader

    flink-java-1.6.2-sources.jar!/org/apache/flink/api/java/ExecutionEnvironment.jav...

    code4it
  • 聊聊flink的PrintSinkFunction

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/data...

    code4it
  • 聊聊flink的ParallelIteratorInputFormat

    本文主要研究一下flink的ParallelIteratorInputFormat

    code4it
  • 聊聊flink的CheckpointedFunction

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/chec...

    code4it
  • 聊聊flink的JDBCOutputFormat

    flink-jdbc_2.11-1.7.0-sources.jar!/org/apache/flink/api/java/io/jdbc/JDBCOutputF...

    code4it
  • 聊聊flink的MemoryBackendCheckpointStorage

    本文主要研究一下flink的MemoryBackendCheckpointStorage

    code4it

扫码关注云+社区

领取腾讯云代金券