第三章 垃圾收集器与内存分配策略(三)

发布时间:2024年01月06日

3.6 低延迟垃圾收集器

衡量垃圾收集器的三项最重要的指标是:

  • 内存占用(Footprint)
  • 吞吐量(Throughput)
  • 延迟(Latency)

随着硬件技术的提高,对于内存占用要求变得不是太高了,更关注延迟。

G1会随着堆变大,停顿的时间变长,原因也很容易理解,需要标记的对象越来越多了。但是新的ZGC、shenandoah不会,他们是与内存大小无关的。

以下两种都是基于标记-整理算法

3.6.1 Shenandoah收集器

由RedHat公司开发

1.三个与G1相比不同之处

  • 支持并发的整理算法
  • 默认不使用分代收集
  • 摒弃了在G1中耗费大量内存和计算资源去维护的记忆集

2.九个阶段

  1. 初始标记

  2. 并发标记

  3. 最终标记

  4. 并发清理

  5. 并发回收

    与其他收集器的核心差异,使用了读屏障(Brooks Pointers)来实现了并发的回收,而不需要停顿。

  6. 初始引用更新

  7. 并发引用更新

  8. 最终引用更新

  9. 并发清理

主要抓住三个重要的阶段:并发标记、并发回收、并发引用更新

3.读屏障-- Brooks Pointer

注意这个是放在**对象**上面的。
读屏障
每次对象访问会带来一次额外的转向开销,尽管这个开销已经被优化到只有一行指令的程度。

问题:修改的时候如何保证正确性?

必须对转发指针的访问操作采取同步措施,这里使用的是比较并交换。

3.6.2 ZGC收集器

由Oracle开发。

1.主要特征

ZGC 收集器是一款基于Region 内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。

2.内存布局

Region具有动态性–动态创建和销毁

3.标志性设计

染色指针技术

对对象的种种标记不再是放在对象的本身属性上,而是放在了指向对象的引用身上。(也就是说这里不需要在用读屏障了

— 某个对象只有它的引用关系能决定它存活与否,对象上其他所有的属性都不能够影响它的存活判定结果。

ZGC 的染色指针是最直接的、最纯粹的,它直接把标记信息记在引用对象的指针上,这时,与其说可达性分析是遍历对象图来标记对象,还不如说是遍历“引用图”来标记“引用”了。

三大优势:

  1. 染色指针可以使得一旦某个 Region 的存活对象被移走之后,这个 Region 立即就能够被释放和重用掉,而不必等待整个堆中所有指向该 Region 的引用都被修正后才能清理。
  2. 染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量,设置内存屏障,尤其是写屏障的目的通常是为了记录对象引用的变动情况,如果将这些信息直接维护在指针中,显然就可以省去一些专门的记录操作。
  3. 染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据,以便日后进一步提高性能。

把染色指针中的标志位看作是地址的分段符,那只要将这些不同的地址段都映射到同一个物理内存空间,经过多重映射转换后,就可以使用染色指针正常进行寻址了,效果如图 :
寻址
4.主要流程

  • 并发标记

  • 并发预备重分配

  • 并发重分配

    重分配是ZGC执行过程中的核心阶段。这个过程要把重分配集中的存活对象复制到新Region 上,并为重分配集中的每个 Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。

  • 并发重映射

文章来源:https://blog.csdn.net/flyingmylife/article/details/135433557
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。