低延迟垃圾收集器

衡量垃圾收集器的三项重要指标:内存占用(Footprint)、吞吐量(Throughput)和延迟(Latency)。三者构成了一个“不可能三角”

Shenandoah收集器

Shenandoah相比于G1有什么改进?

虽然Shenandoah也是基于Region的堆内存布局,同样有着用于存放大对象的Humongous Region,默认策略也是优先处理回收价值最大的Region,但是在堆内存管理上,它与G1至少有着三个明显的不同之处,最重要的是支持并发的整理算法,G1的回收阶段是可以多线程并行的,但却不能与用户线程并发。其次,Shenandoah目前默认不支持分代收集,即不会有专门的新生代Region或者老生代Region的存在,没有实现分代。最后,Shenandoah掘弃了在G1中耗费大量内存和计算资源去维护的记忆集,改用名为“连接矩阵”的全局数据结构来记录跨Region的引用关系,降低了处理跨代指针时的记忆集维护消耗,也降低了伪共享问题的发生概率。

Shenandoah收集器工作的九个阶段:

  • 初始标记:与G1一样,首先标记与GCRoots直接关联的对象,这个阶段仍然是“Stop The World”的,但停顿时间与堆大小无关,只与GC Roots的数量有关;
  • 并发标记:与G1一样,遍历对象图,标记出全部可达对象,这个阶段是与用户线程一起并发的,时间长短取决于堆中存活对象数量以及对象图结构的复杂程度;
  • 最终标记:与G1一样,处理剩余的SATB扫描,并在这个阶段统计出回收价值最高的Region,将这些Region构成一组回收集(Collection Set)。最终标记也会有一小段短暂停顿;
  • 并发清理:这个阶段用于清理那些整个区域一个存活对象都没有的Region,这类Region被称为Immediate Garbage Region;
  • 并发回收:并发回收阶段是Shenandoah与之前HotSpot收集器的核心差异;在这个阶段,Shenandoah要把回收集里面存活的对象先复制一份到其他未使用的Region之中。复制对象的线程与用户线程在这时是并发的,要实现这个其困难点在于:移动对象同时,用户线程仍然可能不停对被移动对象进行读写访问,移动对象是一次性行为,但是移动之后整个内存中所有指向该对象的引用都还是旧对象的地址,这很难一瞬间全部变过来。对于并发回收遇到的这些困难,Shenandoah将通过读屏障和被称为“Brooks Pointers"的转发指针来解决,并发回收阶段运行时间长短取决于回收集的大小;
  • 初始引用更新:并发回收阶段复制对象结束后,还需要把堆中所有指向旧对象的引用修正到复制后的新地址,初始引用更新时间很短,会产生一个非常短暂的停顿;
  • 并发引用更新:真正开始进行引用更新操作,这个阶段与用户线程一起并发,时间长短取决于内存中涉及的引用数量的多少。并发引用更新与并发标记不同,它不需要沿着对象图来搜索,只需要按照内存物理地址顺序,线性地搜索出引用类型,把旧值改为新值即可;
  • 最终引用更新:解决了堆中的引用更新后,还要修正存在于GC Roots中的引用,这个阶段是Shenandoah的最后一次停顿,停顿时间只于GC Roots的数量有关;
  • 并发清理:经过并发回收和引用更新之后,整个回收集中所有的Region已再无存活对象,这些Region都变成Immediate Garbage Region了,最后再调用一次并发清理线程来回收这些Region的内存空间,供以后、新对象分配使用。

ZGC收集器

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

与之前基于Region布局的垃圾收集器不同的是,ZGC的Region具有动态性——动态创建和销毁,以及动态的区域容量大小。在X64硬件平台下,ZGC的Region可以具有大、中、小三类容量:

  • 小型Region:容量固定为2MB,用于放置小于256KB的小对象。
  • 中性Region:容量固定为32MB,用于放置大小等于256KB但小于4MB的对象。
  • 大型Region:容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置4MB或者以上的大对象。

ZGC的核心问题——并发整理算法的实现

Shenandoah使用转发指针和读屏障来实现并发整理,ZGC也同样采用了读屏障,但是ZGC收集器有一个标志性的设计是它采用的染色指针技术。

ZGC的染色指针是直接的、纯粹的,它直接把标记信息记在引用对象的指针上。染色指针是一种直接将少量额外的信息存储在指针上的技术。

优势:

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

ZGC运作过程:

  • 并发标记:与G1、Shenandoah一样,并发标记是遍历对象图做可达性分析的 阶段,前后也要经过类似于G1、Shenandoah的初始标记、最终标记(尽管ZGC中的名字不叫这些)的短暂停顿,而且这些停顿阶段所做的事情在目标上也是相类似的。与G1、Shenandoah不同的是,ZGC的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志位。
  • 并发预备重分配:这个阶段需要根据特定的查询条件统计得出本次收集过程要清理哪些Region,将这些Region组成重分配集(Relocation Set)。重分配集与G1收集器的回收集(Collection Set)还是有区别的,ZGC划分Region的目的并非为了像G1那样做收益优先的增量回收。相反,ZGC每次回收都会扫描所有的Region,用范围更大的扫描成本换取省去G1中记忆集的维护成本。因此,ZGC的重分配集只是决定了里面的存活对象会被重新复制到其他的Region中,里面 的Region会被释放,而并不能说回收行为就只是针对这个集合里面的Region进行,因为标记过程是针对全堆的。此外,在JDK 12的ZGC中开始支持的类卸载以及弱引用的处理,也是在这个阶段中完成的。
  • 并发重分配:重分配是ZGC执行过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。得益于染色指针的支持,ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”(Self-Healing)能力。
  • 并发重映射:重映射所做的就是修正整个堆中指向重分配集中旧对象的所有引用,这一点从目标角度看是与 Shenandoah 并发引用更新阶段一样的,但是 ZGC 的并发重映射并不是一个必须要“迫切”去完成的任务,因为前面说过,即使是旧引用,它也是可以自愈的,最多只是第一次使用时多一次转发和修正操作。重映射清理这些旧引用的主要目的是为了不变慢(还有清理结束后可以释放转发表这样的附带收益),所以说这并不是很“迫切”。因此,ZGC 很巧妙地把并发重映射阶段要做的工作,合并到了下一次垃圾收集循环中的并发标记阶段里去完成,反正它们都是要遍历所有对象的,这样合并就节省了一次遍历对象的开销。一旦所有指针都被修正之后,原来记录新旧对象关系的转发表就可以释放掉了。

经典垃圾收集器(三)相关推荐

  1. JVM_06 垃圾收集器[ 三 ]

    截止JDK1.8,一共有7款不同的垃圾收集器. 每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器 注意:标记算法需要维护一个空闲列表,复制和标记压缩算法则 ...

  2. JAVA经典垃圾收集器与内存分配策略

    目录 判断对象存活状态 引用计数算法 可达性分析算法 再谈引用 finalize()方法 回收方法区 垃圾收集算法--追踪式垃圾收集 分代收集理论 标记-清除算法 标记-复制算法 标记-整理算法 Ho ...

  3. 经典垃圾收集器 CMS、G1

    经典垃圾收集器 经典 GC 器: Serial 收集器:最基础.最古老,使用的是(标记-复制算法),使用场景是新生代,与其对应的是 Serial Old GC.特性:单线程工作,不仅只会使用一个处理器 ...

  4. 深入理解Java虚拟机(第三版)--经典垃圾收集器

    Serial收集器 Serial收集器是最基础.历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择.大家只看名字就能够猜到,这个收集器是一个单线程工作的收 ...

  5. 深入理解java虚拟机(五)GC垃圾回收-经典垃圾收集器

    文章目录 前言 一.Serial收集器(标记-复制算法) 二.ParNew收集器(标记-复制算法) 三.Parallel Scavenge收集器(标记-复制算法) 四.Serial Old收集器(标记 ...

  6. HotSpot的经典垃圾收集器

    文章目录 前言 Serial收集器 ParNew收集器 Parallel Scavenge Serial Old收集器 Parallel Old收集器 CMS收集器 Garbage First收集器 ...

  7. 深入理解Java虚拟机 -- 经典垃圾收集器

    文章目录 1. 综述 2. Serial收集器 3. ParNew收集器 4. Parallel Scavenge收集器 5. Serial Old收集器 6. Parallel Old收集器 7. ...

  8. 垃圾收集器与内存分配策略系列(三)

    经典垃圾收集器 1. Serial收集器 2. ParNew收集器 3. Parallel Scavenge收集器 4. Serial Old收集器 5. Parallel Old收集器 6. CMS ...

  9. 2.垃圾收集器与内存分配策略

    2.1 概述 垃圾收集需要考虑三件事:哪些内存需要回收:什么时候回收:如何回收:经过半个世纪的发展,今天的内存动态分配和内存回收技术都已经十分成熟,但我们为什么要了解垃圾收集和内存分配呢?答案呼之欲出 ...

最新文章

  1. Html5游戏框架createJS组件--EaselJS
  2. 1年左右的Java开发经验面试者的心得
  3. Elasticearch 查询详解 (二)
  4. boost::sort模块实现spreadsort 64 位整数排序示例
  5. java布局管理器的应用总结,GridBagLayout布局管理器的应用
  6. 一体化系统中心服务器,数据中心一体化:监测与控制
  7. php 登录记住密码,php 记住密码自动登录
  8. java如何给顺序表赋值_JAVA模拟新增顺序表及单链表
  9. Oracle“钱夹”的使用
  10. (40)不确定性约束
  11. 组合体计算机绘图的实验原理,机械制图及计算机绘图
  12. 三阶魔方大中小魔公式_三阶魔方花样玩法,公式汇总
  13. 这家协同办公软件厂商,也曾如盛夏莲花般绽放
  14. 红米4a android9.0,小米-红米4A/5A-通刷-LOS-Beta4.0-安卓9.0.0-来去电归属-农历等-本地化增强适配...
  15. ResponseBodyAdvice的使用
  16. 成长笔记(个人心路历程)
  17. 奋斗吧之“和loser对话”小故事
  18. 如何让你的 Python 代码在腾讯云 Linux 中一直运行着
  19. 我的中软国际实习Day16
  20. ibm 服务器 自动关机,IBM 联想 DELL HP服务器自动关机|解决办法整理

热门文章

  1. 方便实用的串口调试工具/串口调试助手/串口精灵 (工具一)
  2. 中国传媒大学计算机课程表,课 程 表 - 中国传媒大学
  3. 如何设计一个C++的类?
  4. Vue实现动态复选框的全选 全不选 获取选中值
  5. 利用VB批量增加行高,解决Excel打印字体显示不全问题
  6. 虚拟表格(大数据表格)
  7. GitModel-动手学概率论_02(python)
  8. Win10打印机使用异常?windows系统如何删除更新补丁解决方案
  9. 文心一格x网易「EVE宇宙航母预研」主题AI绘画大赛即将开启!
  10. LT7911D功能概述 LT7911D是Type-C/DP1.2转双路MIPI/Lvds的一款芯片