JVM垃圾回收器-ZGC

一、概述

ZGC(Z Garbage Collector)是一种高效且可扩展的低延迟垃圾回收器。在垃圾回收过程中,ZGC通过优化算法和硬件支持,将Stop-The-World(STW)时间控制在一毫秒以内,使其成为追求低延迟应用的理想选择。此外,ZGC支持灵活的堆大小配置,从几百兆到16TB的堆大小均可轻松应对,且堆大小对STW时间的影响微乎其微。

二、G1机制

G1的STW时间具体包括以下几个步骤:

  • 初始标记(Initial Mark):STW阶段,采用三色标记法快速标记从GC Root直接可达的对象。此阶段的STW时间通常非常短暂。
  • 并发标记(Concurrent Mark):并发执行阶段,对存活对象进行标记。这个阶段允许用户线程和GC线程同时工作,从而减少了STW时间。
  • 最终标记(Final Mark):STW阶段,处理SATB(Snapshot-At-The-Beginning)相关的对象标记。此阶段的STW时间同样较短。
  • 清理(Cleanup):STW阶段,如果某个区域中没有存活对象,则直接清理该区域。此阶段的STW时间也较短。
  • 转移(Copy):将存活对象复制到其他区域。STW时间较长的阶段,因为它涉及对象的复制和引用更新。

三、G1缺点

G1转移时需要停顿,STW时间较长。因为如果不STW,会出现数据不一致。

举例:假设对象A引用了对象C,在转移过程中,C对象被复制到新的区域。如果此时用户线程修改了A对象的某个属性,但实际上这个修改是针对转移前的C对象。当转移完成后,A对象的引用被更新为指向新的C对象,但此时获取属性仍是原来的旧值,因为修改是在转移前进行的。这种不一致性会导致数据错误。

为了解决这个问题,G1垃圾回收器在转移过程中需要暂停用户线程,确保转移操作的原子性和正确性。然而,ZGC和Shenandoah等新型垃圾回收器解决了这一问题,使得转移过程也能够并发执行,从而进一步提高了性能。

四、ZGC核心技术

1.读屏障(Load Barrier)

在ZGC中,采用了读屏障(Load Barrier)技术来处理对象引用的获取。当尝试获取一个对象引用时,读屏障会检查该引用是否指向了转移后的对象。如果不是,用户线程会将引用更新为指向转移后的对象。这样就可以直接修改转移后的对象的属性。

2.着色指针(Colored Pointers)

着色指针的设计将原本8字节的地址指针巧妙地拆分成了三个部分:

  • 低44位地址:用于直接表示对象的内存地址,这个范围足够覆盖大多数应用程序所使用的内存空间,最多可以表示16TB的内存。
  • 中间4位颜色位:这四位用于存储关于对象状态的信息。每一位只能存储0或1,并且同一时间只有一位可以是1。不同的位代表不同的状态
  • 高16位未使用:这些位在当前实现中未被使用,但为未来扩展提供了空间

终结位:当设置时,表示该对象只能通过终结器(Finalizer)进行访问。

重映射位(Remap):表示在垃圾收集转移过程后,对象的引用关系已经更新。

Marked0和Marked1:用于标记对象是否可达,是垃圾收集过程中的重要标识。

五、ZGC的内存划分

与G1不同的是,ZGC对Zpage的划分更加精细,旨在实现更精确的内存管理和控制,从而进一步减少垃圾回收过程中的停顿时间。ZGC的Zpage可以分为三类,分别是小区域、中区域和大区域,它们各自具有不同的容量和用途:

  • 小区域(Small Zpage):每个小区域的大小为2MB,专门用于存放小型对象,即大小不超过256KB的对象。这种划分方式有助于减少内存碎片,并提高内存利用率。
  • 中区域(Medium Zpage):每个中区域的大小为32MB,用于存放中等大小的对象,即大小在256KB到4MB之间的对象。中区域的引入进一步扩展了ZGC的适用范围,使其能够处理更大规模的内存需求。
  • 大区域(Large Zpage):大区域的大小则根据实际需求动态分配,每个大区域只保存一个大于4MB的大型对象。这种设计允许ZGC在必要时为大型对象提供足够的连续内存空间。
相关推荐
朝新_2 小时前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir2 小时前
Calendar类日期设置进位问题
java·开发语言
木子.李3473 小时前
排序算法总结(C++)
c++·算法·排序算法
季鸢4 小时前
Java设计模式之状态模式详解
java·设计模式·状态模式
闪电麦坤954 小时前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
@yanyu6664 小时前
springboot实现查询学生
java·spring boot·后端
ascarl20104 小时前
准确--k8s cgroup问题排查
java·开发语言
magic 2454 小时前
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
java
爱敲代码的憨仔5 小时前
分布式协同自动化办公系统-工作流引擎-流程设计
java·flowable·oa
Gyoku Mint5 小时前
机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你
人工智能·python·算法·机器学习·pandas·ai编程·matplotlib