ZGC初步了解

ZGC

ZGC和G1,CMS一样都是一种垃圾回收器。那其实G1已经很不错了

为什么还需要ZGC呢

ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括:

  • 停顿时间不超过10ms;

  • 停顿时间不会随着堆的大小,或者活跃对象的大小而增加;

  • 支持8MB~4TB级别的堆(未来支持16TB)

先看下G1垃圾回收器

这里全红的即为需要STW的

ZGC的流程

GC 的完整工作流程如下:

  1. 初始标记(Initial Mark)

    1. 目标:标记 GC Roots 直接关联的对象。

    2. 操作:暂停所有应用线程(STW),快速标记根对象。

    3. 耗时:通常 <1ms。

  2. 并发标记(Concurrent Mark)

    1. 目标:遍历整个对象图,标记所有存活对象。

    2. 操作:GC 线程与应用线程并发执行,通过染色指针记录对象状态。

    3. 关键机制

      • 对象重定位(Relocation):标记过程中发现需要移动的对象,提前记录迁移信息。

      • 再标记(Remark):处理并发标记期间发生变化的对象引用。

  3. 并发转移(Concurrent Transfer)

    1. 目标:将存活对象移动到新的内存区域,释放旧内存。

    2. 操作

      • 预转移(Pre-Transfer):为对象迁移做准备,更新元数据。

      • 转移(Transfer):GC 线程与应用线程并发迁移对象,确保业务线程无感知。

    3. 关键技术

      • 读屏障(Load Barriers):在对象访问时自动修正指针,指向新内存地址。

      • 自愈(Self-Healing):若迁移过程中出现指针失效,可通过染色指针快速恢复。

  4. 最终清理(Final Cleanup)

    1. 目标:回收完全空闲的内存页,重置 GC 周期。

    2. 操作:短暂 STW,清理元数据和统计信息。

ZGC关键技术

通过 并发标记 + 并发转移 + 实时地址修正,实现零停顿。

ZGC 通过 着色指针(Colored Pointer)读屏障(Load Barriers) 技术,在对象转移过程中实现 无锁并发访问

着色指针(Colored Pointer)

Colored Pointer,染色指针是一种让指针存储额外信息的技术。我们知道在64位操作系统里,一个内存的地址总共64位,但是受限于实际物理内存的大小,我们其实并不是真正的使用所有64位。这里如果小伙伴了解linux的虚拟内存管理会很好理解,我这里大概解释一下。我们平时所说操作系统的“物理内存地址“并不是真正的”物理内存地址”,也就是说,并不是物理上,内存颗粒对应的地址。而是操作系统为我们虚拟的一个“虚拟地址”,这个技术被称为虚拟内存管理。虚拟内存基本在所有的linux服务器上都有使用,除了少部分嵌入式设备,因为内存太小不需要使用这种技术。在虚拟内存的帮助下,我们可以做到两个虚拟内存地址对应一个真实的物理地址。

对于JVM来说,一个对象的地址只使用前42位,而第43-46位用来存储额外的信息,即GC对象处于ZGC那个阶段。只使用46位的客观原因是linux系统只支持46位的物理地址空间,即64T的内存,如果一定想要使用更大的内存,需要linux额外的设置。但是这个内存设置在主流的服务器上都够用了。

在引用地址的划分上,对象引用第43位表示marked0标记,44位marked1标记,45位remapped标记,46位finalizable标记。指针染色就是给对应的位置为1,当然这三个位同一个时间只能有一个位生效。这些标记分别表示对象处于GC的那个阶段里。在下面ZGC的详细过程里我们会介绍染色指针怎么帮助GC的。指针的引用地址在各个标记之间切换也被称为指针的自愈。

  1. Java Heap 的 4TB 是物理地址范围

    1. Java Heap 的 4TB 由 0~41 位直接映射的物理地址决定,与 M0/M1 的虚拟地址空间无关。

    2. M0/M1 的虚拟地址空间通过高位元数据扩展,但物理内存仍受限于硬件和操作系统。


5. 实际地址转换示例

假设物理内存地址为 0xDEADBEEF(42 位足够表示):

  • 在 M0 中的虚拟地址

高位元数据(0000) | 物理地址(0xDEADBEEF) => 0x0000DEADBEEF...
  • 在 M1 中的虚拟地址

高位元数据(0001) | 物理地址(0xDEADBEEF) => 0x0001DEADBEEF...
  • 切换地址空间

    • 通过原子操作将默认元数据从 0000 改为 0001,所有新访问自动重定向到 M1。

核心设计

  • 高位存储元数据: ZGC 将 64 位指针的高 4 位(第 42~45 位)用作元数据标记,而非传统对象头存储存活状态。

    位范围用途
    42~45 (4 bits)对象存活状态(标记、转移阶段等)
    0~41实际物理地址
    • 标记位含义

  • 虚拟地址空间划分: ZGC 将 64 位地址空间划分为多个子空间,同一物理内存对应三个虚拟地址:

虚拟地址空间地址范围作用
M0[4TB, 8TB)存放当前活跃对象的最新地址
M1[8TB, 12TB)存放对象转移后的新地址
Remapped[16TB, 20TB)用于地址重定向(空间换时间)
ZGC中读屏障的代码作用:

在对象标记和转移过程中,用于确定对象的引用地址是否满足条件,并作出相应动作。

接下来详细介绍ZGC一次垃圾回收周期中地址视图的切换过程:

  • 初始化:ZGC初始化之后,整个内存空间的地址视图被设置为Remapped。程序正常运行,在内存中分配对象,满足一定条件后垃圾回收启动,此时进入标记阶段。

  • 并发标记阶段:第一次进入标记阶段时视图为M0,如果对象被GC标记线程或者应用线程访问过,那么就将对象的地址视图从Remapped调整为M0。所以,在标记阶段结束之后,对象的地址要么是M0视图,要么是Remapped。如果对象的地址是M0视图,那么说明对象是活跃的;如果对象的地址是Remapped视图,说明对象是不活跃的。

  • 重新标记(Remark)

这个阶段是处理一些并发标记阶段未处理完的任务(少量STW,控制在1ms内)如果没处理完还会再次并发标 记,这里其实主要是解决三色标计算法中的漏标的问题,即白色对象被黑色对象持有的问题。并发标记阶段发 生 引用更改的对象会被记录下来(触发读屏障就会记录),在这个阶段标记引用被更改的对象

  • 并发预备重分配(Concurrent Prepare for Relocate)

      这一步主要是为了之后的迁移做准备,这一步主要是处理软引用,弱引用,虚引用对象,以及重置page的Forwarding table, 收集待回收的page信息到Relocation Set

      Forwarding table是记录对象被迁移后的新旧引用的映射表。Relocation Set是存放记录需要回收的存活页集合。这个阶段ZGC会扫描所有的page,将需要迁移的page信息存储到Relocation Set,这一点和G1很不一样,G1是只选择部分需要回收的Region。在记录page信息的同时还会初始化page的Forwarding table,记录下每个page里有哪些需要迁移的对象。这一步耗时很长,因为是全量扫描所有的page,但是因为是和用户线程并发运行的,所以并不会STW,而且对比G1,还省去了维护RSet和SATB的成本。

    • 初始迁移(Relocate Start)

        这个阶段是为了找出所有GC Roots直接可达的对象,并且切换good mask到remapped,这一步是STW的。这里注意一个问题,被GC Roots直接引用的对象可能需要迁移。如果需要,则会将该对象复制到新的page里,并且修正GC Roots指向本对象的指针,这个过程就是“指针的自愈”。当然这不是重点重点是切换good mask.

      • 并发转移阶段:标记结束后就进入转移阶段,此时地址视图再次被设置为Remapped。如果对象被GC转移线程或者应用线程访问过,那么就将对象的地址视图从M0调整为Remapped。

      其实,在标记阶段存在两个地址视图M0和M1,上面的过程显示只用了一个地址视图。之所以设计成两个,是为了区别前一次标记和当前标记。也即,第二次进入并发标记阶段后,地址视图调整为M1,而非M0。

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

      ZGC的优势很明显,几乎全程并发的回收过程带来了无与伦比的低暂停时间,这也是ZGC的设计思路。低暂停时间加上JAVA本身的支持高并发的特点,假以时日ZGC将来一定是能在服务器领域的展现它大杀器级别的威力。但是为了达到这个设计目标,ZGC其实也牺牲了一些东西,比如吞吐量以及在JDK21之前ZGC不分代

      调优案例(参考美团技术文章)

      案例一:秒杀活动中流量突增,出现性能毛刺

      (1)开启”基于固定时间间隔“的GC触发机制:-XX:ZCollectionInterval。比如调整为5秒,甚至更短。

      (2)增大修正系数-XX:ZAllocationSpikeTolerance,更早触发GC。ZGC采用正态分布模型预测内存分配速率,模型修正系数ZAllocationSpikeTolerance默认值为2,值越大,越早的触发GC,Zeus中所有集群设置的是5。

      案例二:压测时,流量逐渐增大到一定程度后,出现性能毛刺

      增大-XX:ConcGCThreads, 加快并发标记和回收速度。ConcGCThreads默认值是核数的1/8,8核机器,默认值是1。该参数影响系统吞吐,如果GC间隔时间大于GC周期,不建议调整该参数。

      案例三: 单次GC停顿时间30ms,与预期停顿10ms左右有较大差距

      升级Aviator组件版本,避免生成多余的ClassLoader。

      案例四:服务启动后,运行时间越长,单次GC时间越长,重启后恢复

      通过业务优化解决,删除不需要执行的Aviator表达式,从而避免了大量Aviator方法进入CodeCache中。

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76099.shtml

      如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      Tof 深度相机原理

      深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…

      c++-函数增强

      一、编译器对函数名的处理 1. C与C的差异 C编译器&#xff1a;保留原始函数名&#xff0c;无额外处理。例如&#xff1a; int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器&#xff1a;通过name mangling&#xff08;名称修饰&#xff09;生成唯一函数…

      跟着StatQuest学知识08-RNN与LSTM

      一、RNN &#xff08;一&#xff09;简介 整个过程权重和偏置共享。 &#xff08;二&#xff09;梯度爆炸问题 在这个例子中w2大于1&#xff0c;会出现梯度爆炸问题。 当我们循环的次数越来越多的时候&#xff0c;这个巨大的数字会进入某些梯度&#xff0c;步长就会大幅增加&…

      HarmonyOS 之 @Require 装饰器自学指南

      在 HarmonyOS 应用开发工作中&#xff0c;我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里&#xff0c;要是无法确保必要参数在构造时准确传入&#xff0c;就极易引发运行时错误&#xff0c;而且排查起来费时费力。一次偶然的机会&#xff0c;我接触到了 Require 装饰…

      CDN节点对网络安全扫描的影响:挑战与应对策略

      引言 在当今互联网环境中&#xff0c;内容分发网络(CDN)已成为提升网站性能和用户体验的关键技术。然而&#xff0c;CDN的广泛应用也为网络安全扫描带来了新的挑战。本文将深入探讨CDN节点如何影响各类安全扫描工作&#xff0c;分析由此产生的安全风险&#xff0c;并提供有效的…

      【Git多分支使用教程】

      Git多分支使用教程 Git多分支使用手册目录多分支只拉取一个多分支拉取指定几个步骤 1&#xff1a;克隆第一个分支步骤 2&#xff1a;获取其他分支 常见问题与解决方法1. 错误&#xff1a;origin/分支名 is not a commit2. 分支名称冲突3. --single-branch 限制 总结 Git多分支使…

      【身份安全】OAuth 2.0工作原理(一)

      目录 OAuth 授权框架一、OAuth 角色二、协议流程三、应用注册&#xff08;Application Registration&#xff09;用户 ID&#xff08;Client ID&#xff09; 和 用户密码&#xff08;Client Secret&#xff09; 四、权限授予1、授权码链接2、用户授权申请3、应用程序接收授权码…

      大疆上云api直播功能如何实现

      概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…

      ESP-01模块连接手机热点问题及解决方法

      在使用ESP-01模块连接手机热点时&#xff0c;可能会遇到一些问题。本文将详细介绍如何解决这些问题&#xff0c;并分享最终通过将WiFi切换到2.4GHz成功解决问题的经验。 一、问题描述 在尝试使用ESP-01模块连接手机热点时&#xff0c;遇到了连接失败的问题。以下是操作过程中…

      NG-ZORRO中tree组件的getCheckedNodeList怎么使用

      在 NG-ZORRO&#xff08;Ant Design for Angular&#xff09; 的 Tree 组件 中&#xff0c;getCheckedNodeList 方法用于获取当前选中的节点列表&#xff08;包括半选状态节点&#xff09;。以下是具体用法和示例&#xff1a; 基本用法 首先&#xff0c;确保你已通过 ViewChil…

      业务流程先导及流程图回顾

      一、测试流程回顾 &#xfeff; 1. 备测内容回顾 &#xfeff; 备测内容: 本次测试涵盖买家和卖家的多个业务流程&#xff0c;包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调 &#xfeff; 1&#xff09;测试业务流程 …

      从ChatGPT到AutoGPT——AI Agent的范式迁移

      一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…

      【Kafka】分布式消息队列的核心奥秘

      文章目录 一、Kafka 的基石概念​主题&#xff08;Topic&#xff09;​分区&#xff08;Partition&#xff09;​生产者&#xff08;Producer&#xff09;​消费者&#xff08;Consumer&#xff09;​ 二、Kafka 的架构探秘​Broker 集群​副本机制​ 三、Kafka 的卓越特性​高…

      【蓝桥杯14天冲刺课题单】Day 1

      1. 题目链接&#xff1a;19937 艺术与篮球 该题目的难点主要在20240413这个日期需要结束程序跳出循环。最开始将该输出ans的位置放在了for循环之外&#xff0c;此时的日期已经循环完了2024年所有的日期&#xff0c;则最后会统计多而导致结果错误。 AC代码&#xff1a; #incl…

      AI人工智能-Jupyter NotbookPycharm:Py开发

      安装 命令&#xff1a; pip install jupyter 启动 命令&#xff1a; jupyter notebook 启动成功后&#xff0c;下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容&#xff0c;是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验&#xff0c;希望在…

      命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?

      文章作者&#xff1a;腾讯宙斯盾DDoS防护团队 一、血色战场&#xff1a;DDoS攻击游戏产业的致命瞬间 全球黑色星期五 这是一场波及全球的“黑色星期五”&#xff0c;起初无人察觉&#xff0c;包括小林。 他刚下班到家就迫不及待打开电脑&#xff0c;准备体验期待已久的《黑神话…

      使用HTML5和CSS3实现3D旋转相册效果

      使用HTML5和CSS3实现3D旋转相册效果 这里写目录标题 使用HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现思路1. HTML结构2. CSS样式解析2.1 基础样式设置2.2 3D效果核心样式2.3 卡片样式 3. JavaScript交互实现3.1 旋转控制3.2 自动播放功能 技术要点总结项目亮点总…

      【HTML 基础教程】HTML <head>

      HTML <head> 查看在线实例 <title> - 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <base> - 定义了所有链接的URL 使用 <base> 定义页面中所有链接默认的链接目标地址。 <meta> - 提供了HTML文档的meta标记 使用 <me…

      macbook电脑如何清理键盘防止误触

      M1芯片的MacBook电脑关机后按任意键开机&#xff0c;是苹果的功能设计。这样设计的目的是为了方便用户&#xff0c;让用户在想要使用电脑时能快速开机。但是清理电脑键盘的时候却成为了一种苦恼 以下是一些清理 MacBook 键盘防止误触的方法&#xff1a; 使用工具锁定键盘 Cle…

      Rust 面向对象

      Rust 面向对象 引言 Rust 是一种系统编程语言,以其高性能、内存安全和并发支持而受到关注。Rust 的面向对象特性是其强大功能之一,它允许开发者以面向对象的方式构建复杂的应用程序。本文将深入探讨 Rust 的面向对象编程(OOP)特性,包括类的定义、继承、封装和多态等概念…