美文网首页
低延迟垃圾收集器

低延迟垃圾收集器

作者: engineer_tang | 来源:发表于2021-11-13 08:06 被阅读0次

    衡量垃圾收集器的三项指标:内存占用、吞吐量和延迟。两款低延迟收集器Shenandoah和ZGC,它们只有初始标记、最终标记这些阶段有短暂停顿,这部分停顿时间是固定的,与堆容量、堆中对象的数量没有正比例关系。

    1. Shenandoah收集器

    与G1的三个不同之处:

    • 支持并发的整理算法,在回收阶段能与用户线程一起并发执行。
    • 处于性价比的权衡,不使用分代收集。
    • 摈弃了记忆集,采用“连接矩阵”的全局数据结构来记录跨Region的引用关系,降低了处理跨代指针时的记忆集维护消耗,也降低了伪共享问题的发生概率。

    Shenandoah收集器大致分为九个阶段:

    • 初始标记
    • 并发标记
    • 最终标记
    • 并发清理
    • 并发回收
    • 初始引用更新
    • 并发引用更新
    • 最终引用更新
    • 并发清理
    image.png
    Brooks Pointer
    使用转发指针来实现对象移动与用户线程并发的一种解决方案,通过在原有对象布局结构的最前面统一增加一个新的引用字段,在不并发移动情况下,该引用指向对象自己。

    Shenandoah收集器通过比较并交换操作来保证并发时对象的访问正确性。

    读屏障数目比写屏障多得多,所以读屏障的使用必须更加谨慎,不允许任何的重量级操作,计划在JDK13中将Shenandoah的内存屏障模型改进为基于引用访问屏障的实现,而不去管原生数据类型等其他非引用字段的读写,这能够省去大量对原生类型、对象比较、对象加锁等场景中设置内存屏障所带来的消耗。

    2. ZGC收集器

    ZGC收集器希望在尽可能对吞吐量影响不太大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。

    是一款基于Region内存布局的,不设分代的,使用了读屏障、染色指针和内存多重映射等技术实现可并发的标记-整理算法。

    ZGC的Region根据容量可分为大、中、小三类:

    • 小型Region:容量固定为2MB,用于放置小于256KB的小对象。
    • 中型Region:容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
    • 大型Region:容量不固定,可以动态变化,用于放置4MB或以上的大对象。每个大型Region中只会存放一个大对象。

    染色指针技术:染色指针是一种将少量额外信息存储在指针上的技术。在Linux下64位指针的高18位不能用来寻址,在剩下的的46位中,将其高4位提取出来存储4个标志信息。

    其三大优势包括:

    • 染色指针可以使得某个Region的存活对象被移走后,这个Region立即就能够被释放和重用掉。
    • 染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量,这样对程序运行效率是大有裨益的,所以ZGC对吞吐量的影响相对较低。
    • 染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据,以便日后进一步提高性能。

    在x86-64平台上,ZGC设计者采用虚拟内存映射技术,将多个不同的虚拟内存地址映射到同一个物理内存地址上,这是一种多对一映射,多重映射是染色指针技术的伴生产物。

    ZGC收集器运行过程可分为四个阶段

    • 并发标记。遍历对象图做可达性分析,在指针上更新Marked0、Marked1标志位。
    • 并发预备重分配。根据特定的查询条件统计得出本次收集过程要清理哪些Region, 将这些Region组成重分配集。每次回收都会扫描所有的Region。
    • 并发重分配。把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表,记录从就对象到新对象的转向关系。
    • 并发重映射。修正整个堆中指向重分配集中的旧对象的所有引用,这不是必须且迫切要完成的任务,会合并到下一次垃圾收集循环中的并发标记阶段。

    ZGC没有使用记忆集,也没有分代,因此也没有用到写屏障,这样可以减少对用户线程的负担,但其劣势是会限制它能承受的对象分配速率不会太高,当分配的对象来不及回收而产生大量的浮动垃圾时,解决办法是增加堆容量的大小,若要从根本上解除分配对象速率的限制,需要引入分代收集。

    支持“NUMA-Aware”的内存分配,是一种为多处理器或者多核处理器的计算机所设计的内存架构。内存控制器被集成到了处理器的内核中,每个处理核心都有属于自己内存管理器所管理的内存,访问其他处理器核心管理的内存必须通过Inter-Connect通道来完成,ZGC收集器会优先尝试请求线程当前所处的处理器的本地内存上分配对象,以保证高效内存访问。

    它会成为服务端、大内存、低延迟应用的首选收集器的有力竞争者。

    参考:https://shipilev.net/talks/devoxx-Nov2017-shenandoah.pdf

    相关文章

      网友评论

          本文标题:低延迟垃圾收集器

          本文链接:https://www.haomeiwen.com/subject/jmmazltx.html