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 详解 - 简书

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

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

相关文章

计算机学生在大学四年应是以数据结构和算法为重还是技术为重?

我给你说点比较实在的吧,不管你是不是计算机专业科班出身的大学生,不管你在不在本科大学,不管你的出身和背景如何,想要走上计算机工作岗位,那必须得有拿得出手的一技之长,这个行业是靠技术吃饭的。 刚好我有…

Kotlin算法:把一个整数向上取值为最接近的2的幂指数值

Kotlin算法&#xff1a;把一个整数向上取值为最接近的2的幂指数值 import kotlin.math.ln import kotlin.math.powfun main(args: Array<String>) {val number intArrayOf(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)number.forEach {println("$…

一.1 信息就是位+上下文

hello程序的生命周期是从一个源程序&#xff08;或者说源文件&#xff09;开始的&#xff0c;即程序员通过编辑器创建并保存的文本文件&#xff0c;文件名是hello.c。源程序实际上就是一个由0和1组成的位&#xff08;又称为比特&#xff09;序列&#xff0c;8个位被组织成一组&…

python读取指定文件夹下的图片(glob获取)

python读取指定文件夹下的图片&#xff08;glob获取&#xff09; 定义traverse_images函数&#xff0c;仅需要改变下根路径即可 glob是python中用来查找符合特定规则的文件路径名的函数 import os from glob import globdef traverse_images (folder_path):image_formats …

leetcode秋招冲刺 (专题16--18)

专题16&#xff1a;分治 题目169&#xff1a;多数元素&#xff08;YES&#xff09; 解题思路&#xff1a;使用哈希表可以统计出现次数的性质&#xff0c;直接统计就行。 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊…

ESIX配置备份和恢复

ESIX虽然重装很快&#xff0c;但是原本配置就丢失了&#xff0c;在硬件不变的情况下&#xff0c;可以使用配置备份和配置恢复的方法。 1、备份配置 1.1、执行以下两条命令 vim-cmd hostsvc/firmware/sync_configvim-cmd hostsvc/firmware/backup_config如下图&#xff0c;只需…

2024年江苏省研究生数学建模科研创新实践大赛赛题分享-B题

火箭烟幕弹运用策略优化 随着光电技术的发展&#xff0c;现代战争中光电制导对战场重要目标的生存构成了极大威胁。而烟幕在对抗红外制导、激光制导、毫米波探测等光电武器方面具有显著成效。烟幕主要由固体和液体微粒混合而成&#xff0c;它通过散射或吸收的方式&#xff0c;干…

7月6日 VueConf 技术大会即将在深圳举办

7月6日&#xff0c;VueConf 2024 即将在深圳召开&#xff0c;本次大会正值 Vue.js 十周年&#xff0c;旨在聚焦 Vue.js 社区的成员&#xff0c;分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Elasticsearch:Node.js ECS 日志记录 - Winston

这是继上一篇文章 “Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino” 的续篇。我们继续上一篇文章来讲述使用 Winston 包来针对 Node.js 应用生成 ECS 向匹配的日子。此 Node.js 软件包为 winston 记录器提供了格式化程序&#xff0c;与 Elastic Common Schema (ECS) …

为什么要做代码审查?代码审查应该如何进行?代码审查初体验,大家一起来找茬

文章目录 前言示例1示例2示例3示例4总结 前言 “代码审查”&#xff08;Code Review&#xff09;是一种软件开发过程中&#xff0c;团队成员之间相互检查、评估和改进代码的实践。这一过程通常涉及对代码质量、可维护性、性能、安全性以及是否符合编程规范或项目约定的标准进行…

模电基础 - 放大电路的频率响应

目录 一. 简介 二. 频率响应的基本概念 三. 波特图 四. 晶体管的高频等效模型 五. 场效应管的高频等效模型 六. 单管放大电路的频率响应 七.多级放大电路的频率响应 八. 频率响应与阶跃响应 一. 简介 放大电路的频率响应是指在输入不同频率的正弦信号时&#xff0c;电路…

Linux基础-管道命令

管道命令 一、概述二、常见用法1. 统计某个目录下的的文件个数2. 对目录下的排序并抓取关键词保存到文件中3. 获取一个目录下的所有子目录名称 一、概述 管道命令是非常有用的工具。在日常工作中用的非常多&#xff0c;他其实是一个并连命令的高级版。用一句话来概括 "把…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f60…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式&#xff0c;能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化&#xff0c;使其在不同时间…

Java中的消息中间件与异步通信实现

Java中的消息中间件与异步通信实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 消息中间件和异步通信在现代软件系统中扮演着重要角色。它们可以帮助解耦系…

【代码随想录算法训练营第六十二天|卡码网108.冗余连接、109.冗余连接II】

文章目录 108.冗余连接109.冗余连接II 108.冗余连接 就是对输入进来的边判断是否在一个并查集中&#xff0c;在的话就把这个删除了&#xff0c;不再就加入并查集中。 n int(input()) father [0] * (n1) def init():for i in range(n1):father[i] idef find(u):if father[u…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS&#xff0c;为不方便把图、文、日志等形式的文件保存在公有云上的&#xff0c;可以在自己的服务器上部署文件服务器 看过本人前几个文章的&#xff0c;使用docker就会很快上手部署&#xff0c;直接上所有代码 #添加镜像 docker search minio docker p…

干货丨做新媒体运营,你必须了解的5大平台规则

5大平台必看规则 01.小红书 平台特性 小红书是一个以生活方式分享为主的“社区&#xff0b;电商”平台。 其中80%都是女性用户拥有精准的女性流量&#xff0c;是美妆护肤、潮流包包的种草地&#xff01;小红书整体的内容围绕的是精致、极简、自律、丰富有趣的生活。 用户画像…

怎么给电子文档批量盖骑缝章或公章?

怎么给电子文档批量盖骑缝章或公章?假如你有100个PDF电子文档要同时盖缝章&#xff0c;如果不借助专业的盖电子骑缝章软件&#xff0c;还真不好干。下面讲述如何利用e-章宝批量盖电子骑缝章。 1.在软件中导入待批量盖章的PDF文件 如下图&#xff0c;在“待盖章PDF文件”区域…