ZGC在三色指针中的应用

ZGC基于颜色指针的并发处理算法

ZGC初始化之后,整个内存空间的地址视图被设置为Remapped,当进入标记阶段时的视图转变为Marked0(也称为M0)或者Marked1(也称为M1),从标记阶段结束进入转移阶段时的视图再次设置为Remapped。ZGC通过视图的切换加上SATB算法实现并发处理。具体算法如下。
1.初始化阶段
在ZGC初始化之后,此时地址视图为Remapped,程序正常运行,在内存中分配对象,满足一定条件后垃圾回收启动
2.标记阶段
第一次进入标记阶段时视图为M0,在标记阶段,应用程序和标记线程并发执行,那么对象的访问可能来自标记线程和应用程序线程。

  • 标记线程:它从根集合开始标记对象,在标记前先判断对象的地址视图,如果发现对象的地址视图是M0,说明对象是在进入标记阶段之后新分配的对象或者对象已经完成了标记(对象活跃),无须处理。如果发现对象的地址视图是Remapped,说明对象是前一阶段分配的,而且通过根集合可达,所以把对象的地址视图从Remapped调整为M0。(M0表示活跃)
  • 应用程序线程如果创建新的对象,则对象的地址视图为M0。
    如果应用程序线程访问对象并且对象的地址视图是Remapped,说明对象是前一阶段分配的,按照SATB的算法,只要把该对象的视图调整为M0就能防止对象漏标。只标记应用线程访问到的对象还不够,实际上还需要把对象的成员变量所引用的对象都进行递归标记。如果应用线程访问对象地址视图是M0,说明对象是在进入标记阶段之后新分配的对象或者对象已经完成了标记,无须额外处理,直接访问。

所以,在标记阶段结束之后,对象的地址视图要么是M0(活跃),要么是Remapped(垃圾)。这里的虚拟地址虽然不一样,但是指向的是物理内存的同一个区域
所有标记为M0的对象放入活跃信息表

3.并发转移阶段
标记结束后就进入转移阶段,此时地址视图再次被设置为Remapped。

转移阶段会把活跃对象转移到新的内存中,并回收对象转移前的内存空间。在转移阶段,应用程序和标记线程并发执行,那么对象的访问可能来自转移线程和应用程序线程。

  • 转移线程:转移线程仅仅根据活跃对象进行转移。当转移线程访问对象时:
    如果对象在对象活跃信息表中并且视图为M0,则转移对象,并且视图从M0调整为Remapped。
    如果对象在对象活跃信息表中并且视图Remapped,说明对象已经被转移,无须处理。

  • 应用程序线程如果创建新的对象,则对象的地址视图为Remapped。
    如果应用线程访问对象且不在活跃信息表中,则说明是新创建的或者对象无须转移,无须处理。
    如果应用线程访问对象且在活跃信息表中且视图为Remapped,说明对象已经被转移,无须处理。
    如果应用程序线程访问在对象活跃信息表中,且视图为M0,说明对象是标记阶段标记的活跃对象,所以需要转移对象
    在对象转移以后,对象的地址视图从M0调整为Remapped;
    注意,只把应用线程读到的对象进行转移还不够,实际上还需要把对象的成员变量所引用的对象都进行转移,ZGC对这一实现做了优化,由转移线程完成对象成员变量的转移。
    至此,ZGC的一个垃圾回收周期中,并发标记和并发转移就结束了。

我们提到在标记阶段存在两个地址视图M0和M1,上面的算法过程显示只用到了一个地址视图,为什么设计成两个?简单地说是为了区别前一次标记和当前标记。

第一次垃圾回收时地址视图为M0,假设标记了两个对象ObjA和ObjB,说明ObjA和ObjB都是活跃的,它们的地址视图都是M0。在转移阶段,ZGC是按照页面进行部分内存垃圾回收的,也就是说当对象所在的页面需要回收时,页面里面的对象需要被转移,如果页面不需要转移,页面里面的对象也就不需要转移。

假设ObjA所在的页面被回收,ObjB所在的页面在这一次垃圾回收中不会被回收。ObjA被转移后,它的地址视图从M0调整为Remapped,ObjB不会被转移,ObjB的地址视图仍然为M0。

那么下一次垃圾回收标记阶段开始的时候,存在两种地址视图的对象

  1. 地址视图为Remapped的对象,说明该对象在并发转移阶段被转移或者被访问过;
  2. 地址视图为M0的对象,说明该对象在前一次垃圾回收的标记阶段已经被标记。

如果本次垃圾回收标记阶段仍然使用M0这个地址视图,那么就不能区分出对象是活跃的,还是上一次垃圾回收标记过的。

所以新标记阶段使用了另外一个地址视图M1,则标记结束后所有活跃对象的地址视图都为M1。
此时这3个地址视图代表的含义是:

  • M1:本次垃圾回收中识别的活跃对象。
  • M0:前一次垃圾回收的标记阶段被标记过的活跃对象,对象在转移阶段未被转移,但是在本次垃圾回收中被识别为不活跃对象。
  • Remapped:前一次垃圾回收的转移阶段发生转移的对象或者是被应用程序线程访问的对象,但是在本次垃圾回收中被识别为不活跃对象。

上述过程算法演示

image.png

image.png

image.png



作者:西部小笼包
链接:https://www.jianshu.com/p/664e4da05b2c
 

这个介绍比较详细

ZGC 详解 - 简书

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么样的主食冻干算好冻干?品质卓越、安全可靠的主食冻干分享

当前主食冻干市场产品质量参差不齐。一些品牌过于追求营养数据的堆砌和利润的增长,却忽视了猫咪健康饮食的基本原则,导致市场上出现了以肉粉冒充鲜肉、修改产品日期等不诚信行为。更令人担忧的是,部分产品未经过严格的第三方质量检测便上市销…

MATLAB中的SDPT3、LMILab、SeDuMi工具箱

MATLAB中的SDPT3、LMILab、SeDuMi工具箱都是用于解决特定数学优化问题的工具箱,它们在控制系统设计、机器学习、信号处理等领域有广泛的应用。以下是对这三个工具箱的详细介绍: 1. SDPT3工具箱 简介: SDPT3(Semidefinite Progra…

Jetson-AGX-Orin 非docker环境源码编译安装CyberRT

Jetson-AGX-Orin 非docker环境源码编译安装CyberRT 1、安装依赖 sudo apt update sudo apt-get install g gdb gcc cmake sudo apt install libpoco-dev uuid-dev libncurses5-dev python3-dev python3-pip python3 -m pip install protobuf3.14.02、下载CyberRT源码 git cl…

拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式

自2023年后,人工智能技术进入了一个更为成熟和广泛应用的阶段,人工通用智能(AGI)这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景,从架构设计到落地实践,详细介绍拓数派云原生数据计算…

Spring开发实践(四)

VO,BO,PO,DO,DTO的区别 1、PO:Persistant Object(持久对象),基本上,PO对象中的属性就是对应着数据库中表的字段,加上⼀些get和set⽅法的组成。例:个⼈信息表中分别有&am…

德国哥廷根大学《Nature Geoscience》最新成果!揭示热带森林对季节性干旱的响应机制!

本文首发于“生态学者”微信公众号! 越来越多的研究称热带森林的生产力受到养分限制,这可能影响其对季节性干旱的反应(Nature正刊!亚利桑那大学 博士生陈舒立一作兼通讯 最新重磅成果!;《Nature Geoscience…

简洁易用,快速制作高品质产品册的工具

在数字化时代,高效制作高品质产品册的需求日益增长。市场上涌现出众多声称能够帮助快速制作产品册的工具,但真正能兼顾简洁易用和品质的却寥寥无几。 ​这款工具名为“FLBOOK”,它凭借其强大的功能和简单易用的操作界面,赢得了众多…

RK3568笔记三十三: helloworld 驱动测试

若该文为原创文章,转载请注明原文出处。 报着学习态度,接下来学习驱动是如何使用的,从简单的helloworld驱动学习起。 开始编写第一个驱动程序—helloworld 驱动。 一、环境 1、开发板:正点原子的ATK-DLRK3568 2、系统&#xf…

谷粒商城学习笔记-23-分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例

之前已经学习了使用Nacos作为注册中心,这一节学习Nacos另外一个核心功能:配置中心。 一,Nacos配置中心简介 Nacos是一个易于使用的平台,用于动态服务发现和配置管理。作为配置中心,Nacos提供了以下核心功能和优势&am…

适合初学者的嵌入式项目有哪些?

适合初学者的嵌入式项目有哪些? 嵌入式学习是一个实践性很强的领域,通过实际项目可以帮助你巩固理论知识并提升技能。以下是几个适合初学者练手的嵌入式项目,每个项目都涵盖了从硬件到软件的不同层面: 1.LED灯控制 详细描述:在…

Parallels Desktop 19 for Mac 让你的 Mac 变得无比强大

简单来说,Parallels Desktop 19 for Mac 可以让你在苹果 Mac 电脑 (包括 M1、M2 或 Intel) 的电脑上「同时运行」一个或多个 Windows 或 Linux 系统,并能随意在不同平台软件之间切换。它能让你的 Mac 变得无比强大,因为 PD 能让你直接在 macO…

centos下编译安装redis最新稳定版

一、目标 编译安装最新版的redis 二、安装步骤 1、redis官方下载页面 Downloads - Redis 2、下载最新版的redis源码包 注:此时的最新稳定版是 redis 7.2.5 wget https://download.redis.io/redis-stable.tar.gz 3、安装编译环境 yum install -y gcc gcc-c …

debian 12 Install

debian 前言 Debian是一个基于Linux内核的自由和开放源代码操作系统,由全球志愿者组成的Debian项目维护和开发。该项目始于1993年,由Ian Murdock发起,旨在创建一个完整的、基于Linux的自由软件操作系统。 debian download debian 百度网盘…

地理信息安全与隐私保护:守护你我位置的隐形盾牌

在数字时代,地理信息技术如地理信息系统(GIS)和全球定位系统(GPS)已成为日常生活不可或缺的一部分,它们为我们带来便利的同时,也悄然触及个人隐私的敏感地带。今天,我们就来聊聊地理…

ARMxy微电网控制新星:赋能智能电网监控

能源转型和智能电网建设高效、可靠的电力输配系统成为了行业关注的焦点。随着物联网、大数据、人工智能技术的融合应用,电网监控与变电站自动化系统亟需更为智能、灵活的解决方案来提升其性能与稳定性。正是在这样的背景下,ARM电力控制微电网主机BL340以…

前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 预览图片 一般情况下,预览图片功能,是后端返回一个图片地址资源(字符串)给前端,如:ashuai.work/static…

PMP考试必须要报培训班,不能自学!

绝对不是危言耸听。有网友分享了可以自学不报培训班,只是比较幸运,没有赶上这个时期而已。你可以不相信我,但是官方发布的信息你还是要认真考虑。那一期有很多因为自学而没有顺利抢到考位的考生,白白浪费了好几个月的时间。 大家千…

Android adb启动任意app的几种方式

使用adb启动应用程序主要有两种方式:一种是已知应用程序的包名和主Activity,另一种是不知道应用程序的包名和主Activity。 已知应用程序的包名和主Activity 在这种情况下,我们可以通过输入特定的adb命令来启动应用程序。具体步骤如下&#x…

Swin Transformer重磅升级!开源新SOTA准确率高达99.92%,更省计算资源

今天我们来聊一个超强的算法模型,Swin Transformer。 Swin Transformer是一种创新的视觉模型,它通过层次化多尺度架构、移位窗口策略和局部自注意力机制等创新设计,成功解决了传统Transformer从NLP到CV任务时面临的问题,实现了高…

Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

前言:在Java编程语言中,Java集合框架提供了一组丰富的数据结构,以满足各种应用需求。其中,LinkedList作为一种常用的数据结构,具有独特的优势和广泛的应用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内…