JVM18_CMS低延迟垃圾收集器、概述、原理、优缺点、参数设置、三色标记、ASTB 和 Incremental Update、记忆集与卡表(三)

简介: ⑥. 原始快照SATB 和 增量更新Incremental Update⑦. 记忆集与卡表

⑥. 原始快照SATB 和 增量更新Incremental Update


①. 增量更新(Incremental Update):在并发标记过程中,把赋值的这种新增的引用,做一个集合存起来。 在重新标记的时候会找到集合里面的引用然后重新去扫描,再把源头标记为灰色。这就是我们的增量更新


(如下图中的D如果是白色对象没有引用,某一个时刻由于用户线程的影响,将A黑色对象引用了D的情况,解决办法:使用写屏障(这个写屏障在之后)和增量更新解决)


微信图片_20220108144135.png


②. 在把我们新增的引用放到集合的时候,会实现一种写屏障的方式。在对象前后通过一个dirty card queue将引用信息, 存在card中,这个dirty card queue会放在cardtable中,而cardtable是记忆集的具体实现,最终这个引用就会放在记忆集中的


(写屏障我们可以理解为在赋值操作的前面加一个方法,赋值的后面做一些操作,也可以理解为AOP。具体的C++实现代码如下图:)


微信图片_20220108144153.png


③. 原始快照(SATB)算法认为开始标记的都认为是活的对象,如上下图所示,引用B到D的引用改为B到C时,通过write barrier写屏障技术,会把B到D的引用推到gc遍历执行的堆栈上,保证还可以遍历到D对象,相对于d来说,引用从B–>A,SATB 是从源入手解决的,即上面说的第2种情况,


这也能理解为啥叫satb了,即认为开始时所有能遍历到的对象都是需要标记的,即都认为是活的。如果我把b = null,那么d就是垃圾了, satb算法也还是会把D最终标记为黑色,导致D在本轮gc不能回收,成了浮动垃圾


(自己的理解:如上图中的B灰色对象某一个时刻由于用户线程的影响将B到D的引用置为null,解决办法:使用原始快照和写屏障 注意:这个写屏障在前面)


微信图片_20220108144211.png


微信图片_20220108144227.png


⑦. 记忆集与卡表


①. 在刚刚我们再说写屏障的时候提到了卡表,那么我们现在就来说说卡表是干什么用的。但是在说记忆集与卡表之前,我们要先知道what is 跨带引用~


②. 跨带引用:


所谓跨带引用就是老年代的对象引用了新生代的对象,或者新生代的对象引用了老年代的对象。那对于这种情况我们的GC在进行扫描的时候不可能直接把我们的整个堆都扫描完,那这样效率也太低了。所以这时候就需要开辟了一小块空间,维护这种引用,而不必让GC扫描整个堆区域。


③. 记忆集(在新生代中)


记忆集也叫rememberSet,垃圾收集器在新生代中建立了记忆集这样的数据结构,用来避免把整个老年代加入到GC ROOTS的扫描范围中。对于记忆集来说,我们可以理解为他是一个抽象类,那么具体实现它的方法将由子类去完成。这里我们简单列举一下实现记忆集的三种方式:


1.字长精度


2.对象精度


3.卡精度(卡表)


④. 卡表(在老年代中)


卡表(Card Table)是一种对记忆集的具体实现。主要定义了记忆集的记录精度、与堆内存的映射关系等。卡表中的每一个元素都对应着一块特定大小的内存块,这个内存块我们称之为卡页(card page),当存在跨带引用的时候,它会将卡页标记为dirty。那么JVM对于卡页的维护也是通过写屏障的方式,这也就是为什么刚刚我们跟进写屏障操作到最后会发现它会对卡表进行一系列的操作。


注意:(1). 卡表是使用一个字节数组实现:CARD_TABLE[ ],每个元素对应着其标识的内存区域一块特定大小的内存块,称为"卡页"。hotSpot使用的卡页是2^9大小,即512字节


(2). 一个卡页中可包含多个对象,只要有一个对象的字段存在跨代指针,其对应的卡表的元素标识就变成1,表示该元素变脏,否则为0。GC时,只要筛选本收集区的卡表中变脏的元素加入GCRoots里。


相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
40 2
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
35 1
|
26天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
73 0
|
8天前
|
监控 前端开发 安全
JVM工作原理与实战(十四):JDK9及之后的类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JDK8及之前的类加载器、JDK9及之后的类加载器等内容。
18 2
|
8天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
12 2
|
9天前
|
存储 XML 监控
JVM工作原理与实战(三):字节码文件的组成
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
26 6
|
16天前
|
算法 Java UED
【五一创作】值得一看的JVM垃圾收集器
【五一创作】值得一看的JVM垃圾收集器
|
1月前
|
监控 Java
JVM常用的命令行参数
JVM常用的命令行参数
|
1月前
|
算法 Oracle Java
【JVM】了解JVM中动态判断对象年龄的原理
【JVM】了解JVM中动态判断对象年龄的原理
26 0
|
1月前
|
算法 Java
JVM中如何实现垃圾收集
JVM中如何实现垃圾收集