java垃圾回收-三色标记法

news2024/10/7 12:25:29

三色标记法

  • 引言
  • 什么是三色标记法
    • 白色
    • 灰色
    • 黑色
  • 三色标记过程
  • 三色标记带来的问题
    • 多标问题
    • 漏标问题
  • 如何弥补漏标问题
    • 增量更新
    • 原始快照
    • 总结

引言

在CMS,G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户线程又把A对象做清楚时 将会发生严重的错误,那么jvm是如何处理这种问题呢?

什么是三色标记法

主流的垃圾收集器基本上都是基于可达性分析算法来判断对象是否存活的,根据对象是否被垃圾收集器扫描过而用黑白灰三种颜色来标记对象状态的方法。

白色

表示对象尚未被垃圾收集器扫描过。在可达性分析开始阶段,所有的对象都是白色的。若在分析结束后对象仍是白色,则代表对象为不可达对象,需要对这些对象进行回收。

灰色

表示对象已经被垃圾回收器访问过,但这个对象至少存在一个引用还没被扫描过。

黑色

表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。 黑色的对象代表已经被扫描过,他是安全存活的,如果有其他对象引用指向了黑色对象,无需重新扫描一遍。黑色对象不可能直接指向某个白色对象。

三色标记过程

  1. 在gc线程开始标记的时候,所有的对象都是白色,全部放入白色节点集合中。
    在这里插入图片描述

  2. 然后从gc root set开始进行扫描,首先node1,node5 被扫描到,node 1、5被标记成灰色节点,从白色节点集合中挪到灰色节点集合中。
    注意,这里只遍历一次root set集合,不是递归遍历。
    在这里插入图片描述

3, 然后gc会从灰色节点开始继续向下扫描,也就是从node1,node5(被标记成灰色的节点)开始,然后扫描到node2,node6 会被标记成灰色,然后node2,node6从白色集合挪到灰色集合。然后node1,node5因为已经被扫描过了会被标记成黑色,然后从灰色几点挪到黑色节点结合中。
在这里插入图片描述

  1. 继续从灰色节点node2,node6开始往下遍历,因为node2,node6已经被扫描过了,所以会被标记成黑色节点,从灰色节点挪到黑色节点集合中。
    node3节点被标记成灰色节点,从白色节点挪到灰色节点集合中。
    在这里插入图片描述

  2. 继续从灰色节点node3开始遍历,直到最终没有了灰色节点就不会再往下遍历了,因为Node3被遍历过了,所以会被标记为黑色,从灰色集合中挪到黑色集合中。最终只会剩下两种状态的节点(只有黑色和白色)。
    在这里插入图片描述

  3. 最终回收完垃圾节点就只只剩下标记成黑色状态的节点,这就是整个过程。

三色标记带来的问题

因为cms和g1垃圾回收器是一个并发回收的回收器,标记线程和用户线程是并发执行的,那么就有可能在标记过程中,用户线程修改了对象的引用关系,造成多标,或者漏标。那么针对这些问题jvm又是怎么处理的呢?

多标问题

在这里插入图片描述

  • 假如gc线程已经扫描到了对象e,此时e为灰色,说巧不巧这个时候用户现成ObjectC.e=null, 将c的引用e断开了。
  • 因为e是灰色,gc就会认为e对象是可达对象,而不会对e进行回收,但实际上e是个浮动垃圾,但实际上还可以接受,因为等到下次垃圾回收的时候可以回收掉。
  • 但并不代表就不是缺点,如果浮动垃圾较多,可能触发full gc。

漏标问题

在这里插入图片描述
假如用户线程断开了c到e的引用,那么e对象就是不可达对象,而此时b对象又引用了e对象,但是三色标记又不会重新从b点开始标记到e,那么e就会被认为是垃圾对象,但实际e是有引用的。如果对e进行垃圾回收,就会产生错误,这就就漏标问题。

如何弥补漏标问题

我们仔细观察漏标,会发现,这种场景的出现是有条件的,

  • 黑色对象被插入了一条或者多条白色引用。
  • 灰色对象删除了白色对象的引用。

可以归结为:

  • 赋值器插入了一条或者多条从黑色对象到白色对象的引用。
  • 赋值器删除了所有的从灰色对象到白色对象的直接引用或者间接引用。

因此,只要侦查到这2个条件的发生即可,所以产生了两种解决方案——增量更新(Incremental Update)和原始快照(Snapshot At The Beginning, SATB)。

增量更新

增量更新破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时。就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象作为根对象,再重新扫描一遍。比如漏标问题中,一旦B对象直接指向了E对象,那么在并发扫描之后,就会将B对象作为灰色对象,再重新扫描一遍。这样虽然避免了漏标问题,但是重新标记会导致STW的时间变长。

原始快照

原始快照破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后再将这些记录过的引用关系中的灰色对象为根对象再重新扫描一遍。例如漏标问题的途中,C断开E的引用关系时会保存一个快照,然后等扫描结束之后,会把C当作根再重新扫描一遍,假如B没有引用E,那么E对象也会认为是可达对象,这样E就成了浮动垃圾,只能等下次垃圾回收时再回收。

总结

无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。在HotSpot虚拟机中,CMS是基于增量更新来做并发标记的,G1、Shenandoah则是用SATB来实现的。

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

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

相关文章

GEE:基于变异系数法(CV)进行遥感生态指数(RSEI)波动分析

作者:CSDN @ _养乐多_ 本文将在 Google Earth Engine(GEE)平台上复现论文《基于遥感生态指数的青藏公路典型路段路域生态环境质量评估与分析》中使用变异系数法对遥感生态指数(RSEI)进行波动分析的方法和代码。 其公式如下所示, 结果如下所示, 文章目录 一、核心函数二…

c语言(数据在内存中的存储)

1. 整数在内存中的存储 整数的2进制表⽰⽅法有三种,即原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。 正整…

osgEarth学习笔记1-安装osgEarth开发环境

原文链接 本文主要是为了防止丢失,做一些记录,仅供个人学习使用。 QGis的学习和使用基本告一段落了。日常的应用已经离不开QGis了,常用的QGis-API和跨平台的QTQGis开发已经十分熟练了。涉及遥感和GIS领域的二维可视化、数据处理使用QT搭配Q…

Python下有关CV的一些算法和函数

目录: 1. HoughCircles二级目录三级目录 1. HoughCircles 霍夫圆检测 二级目录 三级目录

Linux系统部署DolphinScheduler任务调度系统并实现无公网IP远程访问

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问,结合内…

机试:高精度乘法

问题描述 代码示例 #include <bits/stdc.h> using namespace std;int main(){char a[64],b[64];cin >> a >> b;int A[64],B[64],C[128];for(int i 0; i < strlen(a); i){A[i] a[i] - 0;}for(int i 0; i < strlen(b); i){B[i] b[i] - 0;}// 反转 …

基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

【LinuxC】C语言线程(pthread)

文章目录 一、 POSIX 线程库1.1 POSIX标准1.2 Pthreads1.2 数据类型、函数、宏1.21 数据类型1.22 函数1.23 宏 二、创建线程三、线程同步四、线程销毁五、示例5.1 完整示例5.2 信号量示例 本专栏上一篇文章是Windows下&#xff08;MSVC&#xff09;的线程编程&#xff0c;需要的…

操作系统IO模型

IO模型 如何进行网络通信 Socket通信是进程通讯的一种方式&#xff0c;通过调用这个网络库的一些API函数可以实现分布在不同主机的相关进程之间的数据交换 网络编程的基本流程是什么&#xff1f; 服务端先创建socket套接字&#xff0c;然后用这个套接字去绑定并监听某个端口&a…

社交变革:探索Facebook的魔力

社交媒体平台的崛起已经改变了我们与世界的交互方式&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力和魔力更是不可忽视。本文将深入探讨Facebook如何引领社交变革&#xff0c;并探索其背后的魔力所在。 连接世界的纽带 Facebook的独特之处在于它作为一个社交平台&…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

泰迪智能科技携手华北电力大学理学院共建“校外实践基地”

3月15日&#xff0c;华北电力大学数理学院教学副主任史会峰、科研副主任王涛、概率教研室副主任解西阳莅临泰迪智能科技产教融合实训基地开展“华北电力大学校外实践教学基地”签约揭牌仪式。泰迪智能科技董事长张良均、支持中心负责人王宏刚、外联部吴桂锋进行接待。 活动伊始…

中霖教育好吗?口碑怎么样?

中霖教育专注于教育培训&#xff0c;口碑是非常好的&#xff0c;尤其是近年来职业证书考试受到了广大学生和家长的关注&#xff0c;一个机构的好坏和口碑是大家考虑的首要因素。 1、看教学质量 中霖教育的教师都是有着丰富教学经验的&#xff0c;不仅掌握扎实的基础知识&…

如何通过小程序上的产品力和品牌力提升用户的复购能力?

随着网络购物小程序的发展以及内容电商、社交电商、垂直电商、品牌自营等多个细分类型的出现&#xff0c;小程序成为用户日常购物、大促囤货以及首发抢购的重要场景&#xff0c;市场竞争也逐渐激烈。如何在用户侧获得更多转化、留存与复购&#xff0c;成为企业品牌日益关注的话…

svg代码应用于button

将svg代码的path属性应用于按钮内容&#xff0c;去掉按钮边框&#xff0c;并且自适应svg大小&#xff0c;以下实现的是一个旋转按钮。 svg代码如下(iconfont下载)&#xff1a; <svg t"1710741485848" class"icon" viewBox"0 0 1024 1024" ve…

RDP爆破

工具&#xff1a;超级弱口令检查工具 第一步&#xff1a;双击打开工具 第二步&#xff1a;导入账号 第三步&#xff1a;导入密码 第三步&#xff1a;线程 线程默认是50&#xff0c;如果担心影响业务可以修改为5 第四步&#xff1a;填写目标 第五步&#xff1a;选择需要检查的…

Docker知识--01

虚拟化 # 什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打…

Django HTML模版

一个网站的基本框架&#xff08;如页面布局、导航栏、页脚栏等&#xff09;往往是相同的。可以把这个基本框架做成一个模版&#xff0c;其它正式的HTML页面可以直接套用这个模版&#xff0c;可以大减少各HTML文件的代码量。 语法&#xff08;模版文件中&#xff09;&#xff1…

论文阅读——BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation &#xff08;1&#xff09;单模态编码器&#xff0c;它分别对图像和文本进行编码。图像编码器用ViT&#xff0c;并使用附加的 [CLS] 标记来表示全局图像特征。文本…

【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷

极安云科专注职业教育技能竞赛培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教学与技能培训&#xff0c;成立至今持续优化教学资源与讲师结构&#xff0…