当前位置: 首页 > news >正文

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在必要时为大型对象提供足够的连续内存空间。
http://www.dtcms.com/a/233698.html

相关文章:

  • 【赵渝强老师】Docker的图形化管理工具
  • 行内样式:深入解析与应用指南
  • SpringCloud——OpenFeign
  • 大模型的开发应用(七):大模型的分布式训练
  • AtCoder-abc408_b 解析
  • snprintf函数用法及注意事项详解
  • 【鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API】
  • 力扣刷题Day 71:搜索旋转排序数组(33)
  • Win10、Win11系统,使用谷歌浏览器文件流下载,C盘剩余容量小于4GB时,下载失败问题
  • 我的创作纪念日——聊聊我想成为一个创作者的动机
  • 25.6.5学习总结
  • 风机下引线断点检测算法实现
  • 系统思考持续训练
  • 【Redis】笔记|第10节|京东HotKey实现多级缓存架构
  • 简化复杂系统的优雅之道:深入解析 Java 外观模式
  • AI大模型在测试领域应用案例拆解:AI赋能的软件测试效能跃迁的四大核心引擎(顺丰科技)
  • Q: 数据库增删改查的逻辑如何实现?
  • 软件测试基础知识总结
  • 08_10小结
  • 八:操作系统设备管理之磁盘调度算法
  • 前端面试题之浏览器存储技术Cookie、LocalStorage、SessionStorage、indexDB
  • [蓝桥杯]后缀表达式
  • Scrum基础知识以及Scrum和传统瀑布式开发的区别
  • STL优先级队列的比较函数与大堆小堆的关系
  • I.MX6ULL裸机的EPIT实验
  • 贪心,回溯,动态规划
  • 从零发布一个 Vue 3 Button 组件到 npm(基于 Vite)
  • 更改安卓虚拟机屏幕大小
  • 计算机基础知识(第四篇)
  • 2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题