Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

devtools/2024/12/22 14:17:34/

文章目录

    • 垃圾回收机制
    • 垃圾收集器
      • 垃圾收集器分类
      • ZGC 收集器
        • ZGC 的性能优势
          • 复制算法
          • 指针染色
          • 读屏障
        • ZGC 的工作过程
          • Stop-The-World 暂停阶段
          • 并发阶段

垃圾回收机制

垃圾回收Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收

垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java 垃圾收集器(Garbage Collector, GC)是 Java 虚拟机(JVM)的一部分,它自动管理内存,回收不再使用的对象所占用的内存空间。这有助于防止内存泄漏,并且使得开发人员可以更专注于业务逻辑的编写而不是内存管理。

没有万能的垃圾收集器,只有根据具体应用场景选择适合自己的垃圾收集器。垃圾收集器是垃圾回收算法(如引用计数法、标记清除法、标记整理法、复制算法等)的具体实现。它的主要任务是识别并回收那些不再被程序使用的对象所占用的内存空间,从而避免内存泄漏和内存溢出的问题。

垃圾收集器分类

就目前来说,JVM 的垃圾收集器主要分为两大类:分代收集器分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1ZGC

JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

JDK 默认垃圾收集器(使用 java -XX:+PrintCommandLineFlags -version 命令查看):

  • JDK 8:Parallel Scavenge(新生代)+ Parallel Old(老年代)
  • JDK 9 ~ JDK20: G1

在这里插入图片描述

ZGC 收集器

ZGC(Z Garbage Collector) 是一种低延迟、可伸缩性强的垃圾回收器,是JVM 中的一项重要技术。ZGC的目标是 尽可能地减少垃圾回收对应用程序的停顿时间,并且可以处理大内存堆

它于Java 11版本中正式发布,适用于大内存低延迟服务的内存管理和回收,在 128G 的大堆下,最大停顿时间为 1.68 ms,停顿时间远胜于 G1CMS

相关文章:新一代垃圾回收器ZGC的探索与实践 - 美团技术团队

通过下面的参数启动 ZGC:

java">$ java -XX:+UseZGC className

ZGC的设计原则是给予应用程序更多的时间来执行业务逻辑,以减少垃圾回收的停顿时间。它具有以下特点:

  1. 低停顿时间:ZGC 以毫秒为单位的短暂停顿时间作为目标,在控制在10ms以内。它通过并发的方式进行垃圾回收,减少对应用程序的影响。即使是大型堆内存,ZGC也能维持非常低的停顿时间。

  2. 可伸缩性:ZGC 的设计使其能够处理几个字节到数TB范围内的大型堆内存。它采用了柔性的并发策略,允许在并行、并发和单线程模式之间根据需要做出动态调整。

  3. 不需要设置-Xmx:与传统的垃圾回收器相比,ZGC不要求显式设置最大堆大小。ZGC可以自动按需调整堆的大小,并将内存释放给操作系统

  4. 一致的性能:ZGC致力于提供一致的性能,无论是小型应用还是大型内存应用,都希望能够获得稳定的延迟和吞吐量。

ZGC 的性能优势

G1CMS 类似,ZGC 也采用了复制算法

ZGC 在复制算法的基础上做了重大优化,ZGC 在标记、转移和重定位阶段几乎都是并发的,这是 ZGC 实现停顿时间小于 10ms 的关键所在。

  • ZGC 使用的是柔性并发(Colored Pointers) 的技术,通过将对象指针分成多个颜色(Colored)(指针染色技术),以实现并发的垃圾回收。

  • 它在垃圾回收过程中会对引用关系进行处理,并且可以并发复制和重定向对象。同时,ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。

复制算法

复制算法主要包括以下 3 个阶段:

  1. 标记阶段:从 GC Roots 开始,分析对象可达性,标记出活跃对象。

![[Pasted image 20240918174844.png]]

  1. 对象转移阶段:把活跃对象复制到新的内存地址上。

  2. 重定位阶段:因为转移导致对象地址发生了变化,在重定位阶段,所有指向对象旧地址的引用都要调整到对象新的地址上。

标记阶段因为只标记 GC Roots,耗时较短。但转移阶段和重定位阶段需要处理所有存活的对象,耗时较长,并且转移阶段是 STW 的,因此,G1 的性能瓶颈就主要在转移阶段。

![[Pasted image 20240918174856.png]]

指针染色

ZGC 在垃圾回收过程中会对引用关系进行处理,并且可以并发复制和重定向对象。同时,ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。

在一个指针中,除了存储对象的实际地址外,还有额外的位被用来存储关于该对象的元数据信息。这些信息可能包括:

  • 对象是否被移动了(即它是否在回收过程中被移动到了新的位置)。
  • 对象的存活状态。
  • 对象是否被锁定或有其他特殊状态。

通过在指针中嵌入这些信息,ZGC 在标记和转移阶段会更快,因为通过指针上的颜色就能区分出对象状态,不用额外做内存访问。

ZGC 仅支持64位系统,它把64位虚拟地址空间划分为多个子空间,如下图所示:

![[Pasted image 20240917232735.png]]

其中:

  • 0-4TB 对应 Java 堆
  • 4TB-8TB 被称为 M0 地址空间
  • 8TB-12TB 被称为 M1 地址空间
  • 12TB-16TB 预留未使用
  • 16TB-20TB 被称为 Remapped 空间

当创建对象时,首先在堆空间申请一个虚拟地址,该虚拟地址并不会映射到真正的物理地址。同时,ZGC 会在 M0M1Remapped 空间中为该对象分别申请一个虚拟地址,且三个虚拟地址都映射到同一个物理地址。

下图是虚拟地址的空间划分:

![[Pasted image 20240917232802.png]]

三个空间在同一时间只有一个空间有效。ZGC 之所以设置这三个虚拟地址,是因为 ZGC 采用的是“空间换时间”的思想,去降低 GC 的停顿时间。与上述地址空间划分相对应,ZGC 实际仅使用64位地址空间的第0-41位,而第42-45位存储元数据第47-63位固定为0

![[Pasted image 20240917232909.png]]

由于仅用了第 0~43 位存储对象地址, 2 44 2^{44} 244 = 16TB,所以 ZGC 最大支持 16TB 的堆。而对象的存活信息,则存储在42-45位中,这与传统的垃圾回收并将对象存活信息放在对象头中完全不同。

读屏障

当程序尝试读取一个对象时,读屏障会触发以下操作:

  • 检查指针染色:读屏障首先检查指向对象的指针的颜色信息。

  • 处理移动的对象:如果指针表示对象已经被移动(例如,在垃圾回收过程中),读屏障将确保返回对象的新位置。

  • 确保一致性:通过这种方式,ZGC 能够在并发移动对象时保持内存访问的一致性,从而减少对应用程序停顿的需要。

读屏障可能被 GC 线程和业务线程触发,并且只会在访问堆内对象时触发,访问的对象位于 GC Roots 时不会触发,这也是扫描 GC Roots 时需要 Stop The World 的原因。

下面是一个简化的示例代码,展示了读屏障的触发时机。

java">Object o = obj.FieldA   // 从堆中读取引用,需要加入屏障
<Load barrier>
Object p = o            // 无需加入屏障,因为不是从堆中读取引用
o.dosomething()         // 无需加入屏障,因为不是从堆中读取引用
int i =  obj.FieldB     //无需加入屏障,因为不是对象引用
ZGC 的工作过程

ZGC 周期由三个 STW(Stop The World) 暂停和四个并发阶段组成:标记/重新映射(M/R)并发引用处理(RP)并发转移准备(EC)并发转移(RE)

![[Pasted image 20240917233221.png]]

![[Pasted image 20240917233324.png]]

Stop-The-World 暂停阶段
  1. 标记开始(Mark Start)STW 暂停:这是 ZGC 的开始,进行 GC Roots 的初始标记。在这个短暂的停顿期间,ZGC 标记所有从 GC Root 直接可达的对象。

  2. 重新映射开始(Relocation Start)STW 暂停:在并发阶段之后,这个 STW 暂停是为了准备对象的重定位。在这个阶段,ZGC 选择将要清理的内存区域,并建立必要的数据结构以进行对象移动。

  3. 暂停结束(Pause End)STW 暂停:ZGC 结束。在这个短暂的停顿中,完成所有与该 GC 周期相关的最终清理工作。

并发阶段
  1. 并发标记/重新映射 (M/R) :这个阶段包括并发标记和并发重新映射。在并发标记中,ZGC 遍历对象图,标记所有可达的对象。然后,在并发重新映射中,ZGC 更新指向移动对象的所有引用。

  2. 并发引用处理 (RP) :在这个阶段,ZGC 处理各种引用类型(如软引用、弱引用、虚引用和幽灵引用)。这些引用的处理通常需要特殊的考虑,因为它们与对象的可达性和生命周期密切相关。

  3. 并发转移准备 (EC) :这是为对象转移做准备的阶段。ZGC 确定哪些内存区域将被清理,并准备相关的数据结构。

  4. 并发转移 (RE) :在这个阶段,ZGC 将存活的对象从旧位置移动到新位置。由于这一过程是并发执行的,因此应用程序可以在大多数垃圾回收工作进行时继续运行。

ZGC 的两个关键技术:指针染色读屏障,不仅应用在并发转移阶段,还应用在并发标记阶段:将对象设置为已标记,传统的垃圾回收器需要进行一次内存访问,并将对象存活信息放在对象头中;而在 ZGC 中,只需要设置指针地址的第42-45位即可,并且因为是寄存器访问,所以速度比访问内存更快。

![[Pasted image 20240917233403.png]]

尽管ZGC在降低停顿时间方面表现出色,但与其他垃圾回收器相比,在某些特定场景或对于特定应用程序可能会有一些性能上的差异。因此,在选择垃圾回收器时需根据具体需求和应用程序特点进行评估和选择。


http://www.ppmy.cn/devtools/115920.html

相关文章

web渗透:RCE漏洞

RCE漏洞&#xff0c;即远程代码执行漏洞&#xff0c;是一种安全缺陷&#xff0c;它允许攻击者通过网络在目标系统上执行任意代码。一旦成功利用&#xff0c;攻击者可以完全控制受影响的系统&#xff0c;包括读取敏感数据、安装恶意软件、修改系统配置等。RCE漏洞通常发生在应用…

机器学习周报(9.16-9.22)-Pytorch学习(四)

文章目录 摘要Abstract1 完整模型训练套路及模型验证套路1.1 模型及训练代码1.2 利用GPU训练模型1.3 完整的模型验证&#xff08;测试&#xff09;套路 2 CNN 实现mnist手写数字识别2.1 网络模型搭建2.2 测试训练好的模型 总结 摘要 通过学习CNN模型的训练及验证套路&#xff…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

SpringBoot 消息队列RabbitMQ消息的可靠性 配置连接重试 生产者重连

介绍 有的时候由于网络波动&#xff0c;可能会出现客户端连接MQ失败的情况。通过配置我们可以开启连接失败后的重连机制。 注意事项 当网络不稳定的时候&#xff0c;利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是阻塞式的重试&#xff0c;也就…

【永磁同步电机(PMSM)】 6. 矢量空间算法(SVPWM)

【永磁同步电机&#xff08;PMSM&#xff09;】 6. 矢量空间算法&#xff08;SVPWM&#xff09; 1. SVPWM 的基本原理1.1 SVPWM 的优点1.2 SVPWM 的电路拓扑1.3 连续旋转的空间矢量 2. SVPWM 的算法实现2.1 电压矢量组合方案2.2 SVPWM 的实现步骤 3. 基于 Simulink 的 SVPWM 仿…

0.设计模式总览——设计模式入门系列

在现代软件开发中&#xff0c;设计模式为我们提供了优秀的解决方案&#xff0c;帮助我们更好地组织代码和架构。本系列专栏将对设计模式的基本思想、原则&#xff0c;以及常用的分类、实现方式&#xff0c;案例对比、以及使用建议&#xff0c;旨在提高开发者对设计模式的理解和…

ruoyi-vue若依前端是如何防止接口重复请求

防止接口重复请求是为了避免用户在短时间内多次点击同一个按钮&#xff0c;导致后端接口被多次调用&#xff0c;引发数据异常或性能问题。 之前的文章介绍过后端如何防止接口重复请求&#xff0c;这篇文章介绍一下前端如何防止接口重复提交。 按钮禁用 用户点击按钮后立即将按…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 6 撤回通知消息

当推送的通知消息内容有误或者存在违规情况时&#xff0c;可能会引起用户投诉或监管部门处罚等不良后果。Push Kit为您提供消息撤回功能&#xff0c;降低此类推送可能造成的影响。 说明 消息撤回仅支持使用Token和notifyId撤回。若要使用消息撤回功能&#xff0c;请确保您在推…