ZGC垃圾收集的主要流程

值得说明的是,在执行就地迁移时,ZGC 必须首先压缩指定为对象迁移区域内的对象,这可能会对性能产生负面影响。增加堆大小可以帮助 ZGC 避免使用就地迁移。

图片

如上图,ZGC 的工作流程主要包括以下几个步骤:

  • (STW)标记开始

标记阶段开始的同步点,只会执行一些小的操作,例如设置一些标记位和确定全局颜色。

值得说明的是,在 JDK 16 之前,该阶段的耗时和 GC Roots(静态变量与线程栈中的局部变量)的数量成正比。因此在 JEP 376 中引入了一种新的算法,将扫描线程栈的操作转移到并发阶段,从而显著减少了该阶段的耗时。

  • (并发)标记与重映射

在这个并发阶段,ZGC 将遍历整个对象图,并标记所有对象(根据 GC 周期不同,设置 Marked0 或 Marked1 标记)。同时,将上一个 GC 周期中尚未被重映射的对象(标记仍为 Marked1 或 Marked0)进行重映射。

  • (STW)标记结束

标记阶段结束的同步点,会处理一些边界情况。

  • (并发)迁移准备

该阶段会处理弱引用、清理不再使用的对象,并筛选出需要迁移的对象(Relocation Set)。

  • (STW)迁移开始

迁移阶段开始的同步点,通知所有涉及到对象迁移的线程。

同样的,在 JDK 16 引入 JEP 376 之后,该阶段的耗时不再与 GC Roots 的数量成正比。

  • (并发)迁移

该阶段会并发地迁移对象,压缩堆中的区域,以释放空间。迁移后的对象的新地址会记录到转发表(Forwarding Table)中,用于后续重映射时获取对象的新的地址;该转发表是一个哈希表,使用堆外内存,每个区域分别有一个转发表。

可以看到,在一个 GC 周期中,STW 的阶段和并发阶段交替执行,并且绝大多数操作均在并发阶段执行。

示例

为了更好地理解 ZGC 的工作原理,下面通过一个例子来展示 ZGC 工作各阶段执行的操作。

1. 【GC 开始】初始状态

图片

  • 上图中为 GC 开始前 Java 堆的状态:共有 3 个区域,9 个对象。

  • 所有新创建的对象初始颜色均为 Remapped。

2. 【标记阶段】从 GC Roots 开始遍历,标记所有存活的对象

图片

  • 每次 GC 之间的标记阶段轮流使用 Marked0 与 Marked1,本次使用 Marked0。

  • GC Roots(例如,线程栈中引用的对象,静态变量等)为每次标记的起点,所有被 GC Roots 引用的对象都应被认为是存活的;同样的,如果未被标记(颜色仍为 Remapped),则认为可被回收。

3. 【迁移准备阶段】选择需要压缩的区域,并创建转发表

图片

  • 检查各区域发现,区域 1 与区域 2 存在需要回收的对象,将它们加入迁移集合。

  • 并为所有迁移集合中的区域创建转发表。

4. 【迁移阶段】遍历所有对象,迁移其中处于迁移集合中的对象

图片

a. 遍历到对象 1、2,发现它们位于区域 0(不在迁移集合中),无需迁移,仅将颜色恢复为 Remapped。

b. 遍历到对象 4、5、7,均在迁移集合中,需要迁移。

  1. 创建(或复用)一个新的区域——区域 3,用于放置这 3 个对象。

  2. 依次将这 3 个对象迁移至新的区域,并将它们新的地址记录在转发表中。

  3. 将这 3 个对象的颜色恢复为 Remapped。

注意:

  • 迁移完成后,迁移集合中的区域 1 与区域 2 即可被复用,用于分配新的对象。但为了便于理解,图中保留了 4、5、7 这 3 个对象的历史位置,并加了“'”号用以区分新老位置。

  • 值得注意的是,此时对象 2(对象 4')中记录的对象 5(对象 7)的地址仍为迁移前的地址,指针的颜色也仍为标记时的颜色 Marked0。

5. 【迁移后的任意时间】用户线程加载对象

图片

  • 在对象 7 迁移完成后,如果此时用户线程尝试加载对象 7,会触发读屏障(指针实际颜色 Marked0 与期望颜色 Remapped 不符,是“坏的”)。在读屏障中,会基于转发表,将对象 7 的地址重映射对象 7'。

6. 【下一次 GC 标记阶段】重映射所有未被用户线程加载过的对象

图片

  • 在下一次 GC 的标记阶段,会使用 Marked1 标记出所有存活对象。

  • 与此同时,发现对象 2 引用了对象 5,而对象 5 的颜色是“坏的”(对象 5 的实际颜色 Marked0 与期望颜色 Remapped 不符),会基于转发表,将对象 5 的地址重映射对象 5'。

注意:

  • 每次 GC 的 GC Roots 引用的对象可能不同,在本例中,从对象 1 与对象 4' 变成了对象 2 与对象 7'。

7. 【下一次 GC 迁移准备阶段】清理转发表

图片

  • 与之前的迁移准备阶段类似,需要确定迁移集合、创建转发表。此外,还需要将上一次 GC 的转发表删除。

参考文档

Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得

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

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

相关文章

深入理解计算机系统 CSAPP 家庭作业7.13

用一下496页提到的工具咯 A: whereis libm.a file lidm.a gedit libm.a libm.a是个ASCII text文件打开一看原来 libm-2.27.a 和libmvec.a才是我们要看的 所以我们cd到目标地址后 ar -t libm-2.27.a ar -t libmvec.a B: gcc -Og bar5.c foo5.c 用之前的两个文件链接后生成…

若依项目实战------企业人力资源管理平台

一、数据库名称规范化及建表相关 1.术语名称 1.系统名称:企业人力资源管理平台英文翻译:Enterprise Human Resource Management Platform缩写:EHR 2.员工信息管理(Employee Information Management 缩写:EIM&#…

使用API有效率地管理Dynadot域名,为文件夹更名

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

适用于 Windows 11 的 5 大数据恢复软件 [免费和付费]

为什么我们需要Windows 11数据恢复软件? 计算机用户经常遇到的一件事就是数据丢失,这种情况随时可能发生。错误地删除重要文件和文件夹可能会非常令人担忧,但幸运的是,有一种方法可以恢复 PC 上丢失的数据。本文将向您展示可用于…

通过Socket通信实现局域网下Amov无人机连接与数据传输

1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部",无法访问互联网. [IMAGE:…

经销or直营,新老车企殊途终要同归

步入2024,汽车圈的新人、老人都逐渐活成了对方的样子。 2024年5月,先后有消息传来,阿维塔要从直营模式全部转向经销模式,蔚来新发布的子品牌“乐道”未来可能考虑合作或加盟,并单独建设门店。 而就在5月1日&#xff…

Qt开发 | Qt控件 | QTabWidget基本用法 | QListWidget应用详解 | QScrollArea应用详解

文章目录 一、QTabWidget基本用法二、QListWidget应用详解1.列表模式1.1 基本操作1.2 添加自定义item1.3 如何添加右键菜单1.4 QListWidget如何删除item 2.图标模式 三、QScrollArea应用详解 一、QTabWidget基本用法 QTabWidget 是 Qt 框架中的一个类,它提供了一个选…

DM达梦数据库数学函数整理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

欧洲杯盛宴与火伞云融合CDN:技术革新与体育盛事的完美融合

随着科技的飞速发展,体育盛事也迎来了前所未有的变革。欧洲杯,作为世界足坛的顶级赛事,吸引了全球数亿球迷的目光。而在这个信息爆炸的时代,如何确保球迷们能够流畅、高清地观看比赛,成为了各大媒体和技术公司面临的重…

shell脚本和变量

一、shell脚本 脚本就是可以运行的代码的集合,脚本语言(计算机语言)的特点是:从上到下,按行执行。 LINUX中的shell脚本是运行在shell环境中(/bin/bash),bash是shell的解释器。shel…

一文搞懂Linux多线程【下】

目录 🚩多线程代码的健壮性 🚩多线程控制 🚩线程返回值问题 🚩关于Linux线程库 🚩对Linux线程简单的封装 在观看本博客之前,建议大家先看一文搞懂Linux多线程【上】由于上一篇博客篇幅太长,为…

Java技术栈中的核心组件:Spring框架的魔力

Java作为一门成熟的编程语言,其生态系统拥有众多强大的组件和框架,其中Spring框架无疑是Java技术栈中最闪耀的明星之一。Spring框架为Java开发者提供了一套全面的编程和配置模型,极大地简化了企业级应用的开发流程。本文将探讨Spring框架的核…

打破数据分析壁垒:SPSS复习必备(八)

一、假设检验-基本概念 对总体提出一假设,然后借助样本对该假设进行检验。 原假设 H0: 在统计学中,把需要通过样本去推断正确与否的命题,称为原假设,又称零假设.它常常是根据已有资料或经过周密考虑后确定的. 备择假设H1: 与原假设对立的假设. 显著性水平(signi…

兰州市红古区市场监管管理局调研食家巷品牌,关注细节,推动进步

近日,兰州市红古区市场监管管理局临平凉西北绿源电子商务有限公司进行了深入视察,为企业发展带来了关怀与指导。 食家巷品牌作为平凉地区特色美食的代表之一,一直以来凭借其纯手工工艺和独特的风味,在市场上占据了一席之地。领导…

Linux常用环境变量PATH

Linux常用环境变量 一、常用的默认的shell环境变量二、环境变量 PATH三、持久化修改环境变量四、常用的环境变量 一、常用的默认的shell环境变量 1、当我们在shell命令行属于一个命令,shell解释器去解释这个命令的时候,需要先找到这个命令. 找到命令有两…

统信UOS上鼠标右键菜单中添加自定义内容

原文链接:统信UOS上鼠标右键菜单中添加自定义内容 Hello,大家好啊!今天给大家带来一篇关于在统信UOS桌面操作系统上鼠标右键菜单中添加自定义内容的文章。通过自定义鼠标右键菜单,可以大大提升日常操作的效率和便捷性。本文将详细…

面向对象修炼手册(四)(多态与空间分配)(Java宝典)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀面向对象修炼手册 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 1 多态 1.1 多态的形式&…

节省一个小目标,电手官方一键「傻瓜式」重装系统

大伙儿下午好,这是一篇负收益的广子。 没错,电手上线了重装 Windows 系统的工具类软件。 和我们顶头老大傲梅分区助手一样,不含捆绑,上手简单,完全免费,用爱发电。 众所周知,微软对于系统的更…

韩顺平0基础学java——第30天

p600-611 坦克大战! 艰难推进中 坦克大战-子弹 发射子弹 1.当发射一颗子弹后,就相当于启动一个线程 2.玩家拥有子弹对象,当按下J时,就启动发射行为(线程),让子弹不停移动,形成…

最新!计算机类SCI期刊全名单!你想发的顶刊都在这里

【SciencePub学术】近日,2023JCR正式发布,最受瞩目就是各类期刊的最新影响因子排名,本期,小编对计算机类的期刊做了一个整理,供计算机方向的研究学者们参考! 来源:WOS数据库官网 完整名单 ※ 本…