ZGC在三色指针中的应用

news2024/9/17 9:01:40

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.coloradmin.cn/o/1918811.html

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

相关文章

社区团购小程序源码系统 带完整的安装代码以及搭建部署教程

系统概述 在这个数字化时代,线上活动成为了连接用户与组织者的桥梁。为了满足不同场景的需要,开发一个灵活、可定制的在线活动报名表单小程序显得尤为重要。本文将深入介绍一个自定义在线活动报名表单小程序的源码系统,并提供详细的搭建部署…

sublime中无法找到Package Control或Install Package

在Crtl Shift P 中无法查找到Package Control或Install Package或调用产生报错。 可以尝试在 首选项 ---- > 设置中 检查配置文件"ignored_packages":紧跟的中括号中是否为空,如果不为空请删除其中内容。 如果不确定内容,可以用下面的…

VScode代码对齐快捷键

解决复制过来代码对齐格式问题。 左对齐:Ctrl[ 右对齐:Ctrl]

从零开始做题:logtime

题目 给出1个pcapng文件 解题 wireshark打开题目流量包,在TCP流中发现flag.zip压缩包流量,将flag.zip提取到本地,解压的过程中需要解压密码,接着观察流量 import pyshark import re pcapFilePath logtime.pcapng pcapFilter…

C++基础(十七):模板进阶

前面我们学习过模板,这一节我们对模板进行进阶的学习。 目录 一、非类型模板参数 二、类模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 三、模板的分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 3.…

医院人员管理系统03_下午:C3P0连接池,完成简单的增删改查

文章目录 什么是C3P0项目目录Students.javaC3P0Conn.javaStuDao.java套路代码 什么是C3P0 C3P0连接池要比jdbc更简单,dao层写方法就能看出来 项目目录 Students.java 没有变,直接是jdbc的实体类 跳转我的上一篇文章查看实体类代码 C3P0Conn.java 这…

AmazonS3部署以及nacos配置参数

AmazonS3部署 因为涉及到做的需求的头像的处理,所以需要去找头像的来源,没想到又是我们的老熟人,AmazonS3,巧了已经是第二次用了,上次我是用的别人的工具类去干的,这一次我这边自己编辑具体工具类型。 对应…

敏捷专家CSM认证培训内容概述(附2024年开班时间表)

敏捷专家CSM认证培训是专为希望在Scrum项目中担任Scrum Master角色的个人而设计的专业培训。CSM认证,全称Certified Scrum Master,是敏捷开发领域中备受认可的证书,由Scrum Alliance颁发。以下是对敏捷专家CSM认证培训的详细介绍:…

solidity实战练习1

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; contract PiggyBank{constructor()payable{emit Deposit(msg.value);//触发事件1//意味着在部署合约的时候,可以向合约发送以太币(不是通过调用函数,而是直接在部署合约时发送&#…

JAVA中的回溯算法解空间树,八皇后问题以及骑士游历问题超详解

1.回溯算法的概念 回溯算法顾名思义就是有回溯的算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法&#xff…

Python 神器:wxauto 库——解锁微信自动化的无限可能

📝个人主页🌹:誓则盟约 ⏩收录专栏⏪:机器学习 🤡往期回顾🤡:“探索机器学习的多面世界:从理论到应用与未来展望” 🌹🌹期待您的关注 🌹&#x1f…

短视频矩阵:批量发布的秘密揭秘

在数字化时代,短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作,短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而,有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…

【Django】报错‘staticfiles‘ is not a registered tag library

错误截图 错误原因总结 在django3.x版本中staticfiles被static替换了,所以这地方换位static即可完美运行 错误解决

旧衣回收小程序开发,提高回收效率,实现创收

随着人们生活水平的提高,对穿衣打扮也越来越重视,衣服更换频率逐渐增高,旧衣回收行业因此产生,并随着市场规模的扩大,拥有了完善的回收产业链, 旧衣回收行业的发展不仅能够让大众获得新的赚钱方式&#xf…

探索创意无限:精彩APP启动页设计案例汇总

启动页是应用启动时出现的过渡页面或动画,旨在提升用户体验、缓解用户焦虑,以及传递品牌或产品的人情味。根据应用性能,其停留时间可能从1秒到3秒不等。启动页同样是应用名片,需要展现品牌的独特个性。运用品牌颜色和 IP 形象能加…

C语言 指针和数组——指针数组的应用:命令行参数

目录 命令行参数 演示命令行参数与main函数形参间的关系 命令行参数  什么是 命令行参数( Command Line Arguments )?  GUI 界面之前,计算机的操作界面都是字符式的命令行界面 ( DOS 、 UNIX 、 Linux &…

215.Mit6.S081-实验三-page tables

在本实验室中,您将探索页表并对其进行修改,以简化将数据从用户空间复制到内核空间的函数。 一、实验准备 开始编码之前,请阅读xv6手册的第3章和相关文件: kernel/memlayout.h,它捕获了内存的布局。kernel/vm.c&…

什么是渲染:两种渲染类型、工作原理

如果您是网页设计师或数字艺术家,您可能熟悉渲染过程的概念。这是数字艺术中的重要步骤,帮助您将图形模型转换为最终结果。在本文中,您将了解数字艺术中的渲染是什么、它的工作原理以及它的类型。 一、什么是渲染? 渲染是使用计算机软件对数…

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

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

Python实现傅里叶级数可视化工具

Python实现傅里叶级数可视化工具 flyfish 有matlab实现,我没matlab,我有Python,所以我用Python实现。 整个工具的实现代码放在最后,界面使用PyQt5开发 起源 傅里叶级数(Fourier Series)由法国数学家和物理学家让-巴…