G1垃圾回收器深入探索——卡表、记忆集和SATB算法

G1垃圾回收器,我们常常会提到里面的分区和垃圾回收算法,这次我们撇开表层,仔细看看里面的三个核心组成部分及其原理。
Card Table(卡表)
在进行YoungGC时,我们会判断一个对象是否被引用,但这个过程需要扫描整个Old区,所以JVM设计了CardTable,将Old区分为一个一个Card,一个Card有多个对象;如果一个Card中的对象有引用指向Young区,则将其标记为Dirty Card,下次需要进行YoungGC时,只需要去扫描Dirty Card即可。
我们看看卡表的结构吧:
在这里插入图片描述
RSet(Remembered Set,记忆集)
在GC的时候,对于old->young和old->old的跨代对象引用,不需要扫描整个堆找到谁引用了当前分区中的对象,只要扫描对应的CSet中的RSet即可。逻辑上说每个Region都有一个RSet,RSet记录了其他Region中的对象引用本Region中对象的关系,属于points-into结构(谁引用了我的对象)。
而Card Table则是一种points-out(我引用了谁的对象)的结构,每个Card 覆盖一定范围的Heap(一般为512Bytes)。G1的RSet是在Card Table的基础上实现的:每个Region会记录下别的Region有指向自己的指针,并标记这些指针分别在哪些Card的范围内。这个RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index集合。每个Region中都有一个RSet,记录其他Region到本Region的引用信息;使得垃圾回收器不需要扫描整个堆找到谁引用当前分区中的对象,只需要扫描RSet即可。而维系RSet中的引用关系靠post-write barrier和Concurrent refinement threads来维护。
记忆集结构:
在这里插入图片描述
好了,我们来看看这两个具体是怎么合作的。
这两个结构在年轻代的回收时候发生着主要作用。具体怎么执行的呢?核心就是我们的写屏障!
在这里插入图片描述
我们在一个指令前后加上屏障,更新卡表,卡表在合适的时候更新记忆集,然后我们的回收器直接去记忆集里拿数据就OK啦。
看完了年轻代的回收,我们再来看看混合回收阶段的SATB算法。
SATB算法的核心是三色标记法,不懂的可以跳转我的另外一篇文章,看看黑灰白三色标记法的具体原理。这里我只做简单的介绍。
三色标记法即将所有对象分为三种颜色
白色:没有检查
灰色:自身被检查了,成员没被检查完(可以认为访问到了,但是正在被检查,就是图的遍历里那些在队列中的节点)
黑色:自身和成员都被检查完了
SATB算法的基本思想:
1、并发标记之前先给Region内存打个快照,标记线程基于这个快照独立进行标记。应用线程不会直接修改这个快照中的对象,也就是说应用线程不会干扰标记线程的工作。
2、应用线程新分配的对象都认为是活跃对象,实际在下一个并发标记周期进行标记。
3、并发标记过程中已存在对象的引用关系变更在Remark阶段单独进行处理。在并发标记阶段如果有引用关系被删除,就记录下来,Remark阶段对这些引用关系被删除的重标记,这个破坏了步骤一,即灰色对象断开了白色对象引用的时候,记录下来,后面重新把这个白色对象标记成存活对象。
我们结合图来看看:
在这里插入图片描述
我们把中间发生变动的放到SATB队列里,然后合并继续标记,所有SATB里面的对象直接默认存活。

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

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

相关文章

软考复习笔记day3(计算机体系结构和指令系统基础)(精简版)

计算机体系结构分类 处理机数量分类: 单处理(一个处理单元)并行处理系统(两个以上处理机互联).分布式处理系统 Flynn分类:(常考) 以指令流和数据流进行区别 指令流由控制部分进…

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive(保活): Keepalive 是一种机制,通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息(称为keepalive消息)实现的。如果在预定时…

使用aop做权限控制

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

甘当“银行引流中介”?飞猪旅行的“猪小金”产品暗藏玄机

在今年“315”晚会上&#xff0c;央视曝光了同程金融以赊销礼包、回购礼品卡的套路变相开展高息“现金贷”等业务乱象。目前&#xff0c;同程金融已对相关产品进行下线&#xff0c;同时对该公司所有产品进行合规性检查。 而这种在监管灰色地带试探的戏码&#xff0c;也出现阿里…

离散数学之范式方法

引子&#xff1a; 对于一个命题&#xff0c;如何判定命题公式为永真式、永假式和可满足的呢或二个命题公式等价。我们学过二种方法&#xff1a; 1&#xff0c;真值表法&#xff1a;对于变元的所有真值指 派&#xff0c;看对应命题公式的真值。2&#xff0c;命题演算方法&#…

YOLO算法改进Backbone系列之:CAT

Transformer广泛应用于NLP后&#xff0c;在CV领域也引起了广泛关注&#xff0c;但是将单词token替换为图像的patch使得Transformer计算量大幅增加。本文提出一种新的注意力机制Cross Attention&#xff0c;不再计算全局注意力而是将注意力的计算局限在patch内部来捕获局部信息&…

美区id怎么充值,可以使用虚拟信用卡吗?

美区apple id可以绑使用虚拟卡绑定&#xff0c;并且可以使用 今天早上刚刚尝试的&#xff0c;我用的卡头556167&#xff0c;点击获取卡

抖音平台热销的本腾和新讯随身WiFi,哪个更靠谱,更值得购买?

经常有粉丝朋友摆脱小编测评一下在某短视频平台上面非常火爆的两款随身WiFi&#xff0c;本腾随身WiFi和新讯随身WiFi到底哪个更好。今天&#xff0c;小编就为大家带来最真实的体验测评。 一、外观和产品 这方面新讯要比本腾做的更好&#xff0c;本腾的设备相对单一一些。新讯则…

电脑安装双系统windows和ubuntu server

1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件&#xff0c;用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘&#xff08;linuxboot 和linuxroot&#xff09;&#xff0c;后面一个一个用于boot&#xff0c;一个用于root. 3.开机U盘启…

Vmware虚拟机强制退出Ubuntu后无法开启,报错【开机时出错: VMware Player 无法连接到虚拟机。】

1. 现象 虚拟机强制退出Ubuntu后无法开机&#xff0c;报错如下&#xff1a; 2. 解决方法 任务管理器结束VMware相关的任务

CBAM解析及代码(Pytorch)

CBAM&#xff0c;全称Convolutional Block Attention Module&#xff0c;是一种注意力机制模块&#xff0c;用于增强卷积神经网络&#xff08;CNN&#xff09;的特征表达能力。该模块由通道注意力模块和空间注意力模块两部分组成&#xff0c;能够分别关注输入特征图的通道信息和…

算法思想总结:模拟算法

一、模拟算法的总结 1、本质&#xff1a;比葫芦画瓢 2、特点&#xff1a;思路较简单&#xff0c;根据题目要求即可&#xff0c;代码量和细节较多 3、解决方法&#xff1a; &#xff08;1&#xff09; 模拟算法流程&#xff0c;在草稿纸上进行演算 &#xff08;2&#xff09;…

GAMMA数据处理问题(七)

phase_sim_orb报这个错是什么原因呢&#xff0c;说是我的hgt文件和模拟的干涉图行数不匹配&#xff0c;之前geocode生成hgt的参数不是在mli.par文件中看吗&#xff0c;为什么会出现行数不匹配的情况啊&#xff0c;难道不是par文件中里面看&#xff1f;&#xff1f;&#xff1f;…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

结构体内存对齐 offsetof 枚举 联合体

文章目录 结构体结构体内存对齐结构体嵌套结构体内存对齐的原因修改默认对齐数设置默认对齐数 #pragma pack() offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。 结构体传参值传递地址传递 位段枚举联合 联合体 共用体联合体大…

【JS】深度学习JavaScript

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【JS】深度学习JavaScript &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …

LeetCode 热题 100 | 堆(二)

目录 1 什么是优先队列 1.1 优先队列与堆的关系 1.2 如何定义优先队列 1.3 如何使用优先队列 1.4 如何设置排序规则 2 347. 前 K 个高频元素 2.1 第 2 步的具体实现 2.2 举例说明 2.3 完整代码 3 215. 数组中的第 K 个最大元素 - v2 菜鸟做题&#xff0c;语…

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…

2024公认口碑最好的洗地机有哪些?若看重清洁力,这四款最值得买

每当我们要清洁卫生时&#xff0c;是否总是感到腰酸背痛、疲劳不堪&#xff0c;甚至头昏眼花&#xff1f;地板是家中的重要门面&#xff0c;不容忽视的卫生焦点。如今&#xff0c;我们终于多了一位家务打扫的救星——家用洗地地机。一次操作&#xff0c;即可完成扫地除尘、地除…

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计&#xff0c;用于…