JVM垃圾回收——三色标记法

news2024/11/23 8:51:51

目录

一、什么是三色标记

二、三色标记的过程

三、三色标记的缺点

四、垃圾回收机如何弥补三色标记的缺点


        在CMS、G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户线程又将A对象标记为可达对象,那么此时直接对A对象做清除时那将会发生很严重的错误,那么对象A是如何摆脱被清除的命运呢?今天就简单来聊聊这个问题。

一、什么是三色标记

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

  • 白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始阶段,所有的对象都是白色的,若在分析结束之后对象仍然为白色,则表示这些对象为不可达对象,对这些对象进行回收。
  • 灰色:表示对象已经被垃圾收集器访问过,但是这个对象至少存在一个引用(属性)还没有被扫描过。
  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经被扫描过。黑色表示这个对象扫描之后依然存活,是可达性对象,如果有其他对象引用指向了黑色对象,无须重新扫描,黑色对象不可能不经过灰色对象直接指向某个白色对象。

二、三色标记的过程

初始状态

        初始阶段只有GC Roots是黑色的,其他对象都是白色的,如果没有被黑色对象引用那么最终都会被当做垃圾对象回收。

 

开始扫描

        A和B均为扫描过的对象并且其引用也已经被垃圾回收器扫描过所以此时A、B对象均变为了黑色,而刚扫描到对象C,由于C的D和E还没有被扫描到,所以C暂时为灰色。

 

顺利扫描结束

        此时扫描完成,黑色对象就是存活的对象,即可可达对象,白色对象G为不可达对象,在垃圾回收时就会被回收掉。

 

三、三色标记的缺点

        我们知道CMS和G1等垃圾回收器是一个并发回收的垃圾回收器,上面的图片只是展示了一种理想状态下的三色标记,实际上在并发的情况下会存在多标和漏标的问题。

 场景

        假如GC线程已经扫描到了E对象,此时E对象为灰色,这个时候用户线程将C的引用E断开,那么GC就会认为E对象是可达对象,而不会对E进行垃圾回收,但实际上E是个垃圾对象,这个时候就会产生多标问题,多标问题其实还可以接受,E作为浮动垃圾,那么等到下次垃圾回收的时候回收掉。

 场景

        假如用户线程先断开了C到E的引用,那么E对象就认为是不可达对象,而此时B对象又引用了E对象,但是三色标记又不会重新从B点开始标记到E,那么E就会被认为是垃圾对象,但实际上E是有引用的,那么此时对E进行垃圾回收,之后就一定会产生错误,这就是漏标问题。

四、垃圾回收机如何弥补三色标记的缺点

        上面演示了三色标记法存在的一些问题,那么如何解决这些问题呢。首先存在以上问题有两个条件同时满足才会发生

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

        那么要想解决并发扫描时对象消失的问题只需要破坏任何一个条件即可。因此产生了两种解决方案——增量更新(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/2445.html

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

相关文章

基于Session实现短信登录

目录 一、基于Session实现登录 1.1 业务流程图​编辑 二、发送短信验证码 2.1 发送短信请求方式及参数说明 2.2 业务层代码模拟发送短信 三、登录功能 3.1 短信验证的请求方式及路径 3.2 业务层代码实现用户登录 3.3 拦截器——登录验证功能 三、隐藏用户敏感信息 …

React-Hooks源码深度解读

useState 解析 useState 使用 通常我们这样来使用 useState 方法 function App() {const [num, setNum] useState(0);const add () > {setNum(num 1);};return (<div><p>数字: {num}</p><button onClick{add}> 1 </button></div>…

前Zynga中国总裁田行智联合创办的亚创拟上市:市值25亿美元 公司PPT曝光

雷递网 雷建平 10月31日前Zynga中国总裁田行智&#xff08;Andy Tian&#xff09;联合创办的亚洲创新集团&#xff08;Asia Innovations Group Limited&#xff0c;简称“亚创集团”&#xff09;日前拟通过SPAC模式上市。亚创集团已与特殊目的收购公司&#xff08;SPAC&#xf…

【C++】内联函数auto关键字基于范围的for循环指针空值nullptr

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;内联函数…

Bitquery与Moonbeam集成,为多链提供链上数据访问

Moonbeam是一个智能合约平台&#xff0c;用于构建跨链互连应用程序&#xff0c;能够访问任何链上的用户、资产和服务。通过将来自以太坊、Cosmos、波卡等功能整合到一个平台中。近日&#xff0c;Moonbeam与Bitquery集成&#xff0c;为市场分析、资金流、DeFi等多链提供链上数据…

JavaScript 53 JavaScript 箭头函数

JavaScript 文章目录JavaScript53 JavaScript 箭头函数53.1 语法53.2 this 怎么办&#xff1f;53.2.1 常规函数53.2.2 箭头函数53.3 浏览器支持53 JavaScript 箭头函数 ES6 中引入了箭头函数。 箭头函数允许我们编写更短的函数 53.1 语法 以前定义函数 hello function() …

一位小镇做题家的付费咨询

前几天&#xff0c;有位知乎读者咨询我&#xff0c;感觉很迷茫&#xff0c;不知道做什么。这可能也是大多数在校大学生的状态&#xff0c;忙忙碌碌&#xff0c;浑浑噩噩&#xff0c;不知道该怎么办。 首先&#xff0c;不管从事哪个行业&#xff0c;你的学历一定是亮点。专业的话…

Flutter ChoiceChip 用来实现选择标签效果

程序员如果敲一会就停半天&#xff0c;抱着一杯茶&#xff0c;表情拧巴&#xff0c;那才是在编程&#xff0c;在之前我要实现一级标签效果&#xff0c;我还在苦苦写了好多嵌套的代码&#xff0c;当我看到 Clip 时&#xff0c;泪奔啊&#xff0c;原来一个组件就可以实现&#xf…

(8个方法)解决windows11/10/8/7卡在准备就绪一直转圈

许多用户会遇到Win10安装卡在准备就绪一直转圈的情况或者重装系统准备就绪转圈的问题。也有一些用户反映&#xff0c;Win10准备就绪后黑屏重启&#xff0c;一直循环。一开始大家会耐心等待&#xff0c;但是等了很久后发现没什么用&#xff0c;这该怎么办&#xff1f;本文教你一…

第32讲:MySQL数据库的体系结构组成

MySQL数据库的体系结构组成 MySQL数据库整个体系结构可以分为五个部分,如下图所示: 1)客户端连接器 这一层也是整个MySQL体系中的最上层,包含本地Sock通信和支持大多数客户端到服务端的TCP通信,像JAVA的JDBC、Python、PHP都可以连接到MySQL数据库。 2)数据库连接层 客…

嵌入式分享合集92

一、常用电路基础公式 1.欧姆定律计算 计算电阻电路中电流、电压、电阻和功率之间的关系。 欧姆定律解释了电压、电流和电阻之间的关系&#xff0c;即通过导体两点间的电流与这两点间的电势差成正比。说明两点间的电压差、流经该两点的电流和该电流路径电阻之间关系的定律。该…

2022年了,软件测试已经饱和了?

这个年头找工作跟找对象一样难&#xff0c;咳咳&#xff0c;工作对象都木有&#xff0c;双重打击5555。 关于今年的就业市场&#xff0c;很多人表示特别惨淡&#xff0c;以往简历一投就有大批企业来联系&#xff0c;今年自己投递一大堆简历出去&#xff0c;可能全部都是已读不…

链路状态路由协议OSPF——理解OSPF多区域原理

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.OSPF的多区域 1.OSPF概述 2.生成OSPF多区域的原因 二.OSP…

ArrayList源码解析(JDK8)

文章目录一、ArrayList继承体系二、ArrayList属性三、构造方法1、ArrayList(int initialCapacity)2、ArrayList()3、ArrayList(Collection<? extends E> c)四、ArrayList 相关操作方法1、add(E e)2、add(int index, E element)3、addAll(Collection<? extends E>…

【C++笔试强训】第十八天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

Dubbo源码学习(八)ScopeBeanFactory对比Spring 的BeanFactory

目录 1. ScopeBeanFactory与BeanFactory对比 2. 注册Bean 3. 执行一系列的PostProccessor 1. ScopeBeanFactory与BeanFactory对比 ScopeBeanFactory是Dubbo自己定义的管理Bean的一个类, 类似于Spring BeanFactory注册管理Bean的方式&#xff0c; 不同的是Spring BeanFactor…

软考下午第5题——面向对象程序设计——代码填空(老程序员必得15分)

第五个题目分为C 和 Java两个题目&#xff0c;除去编写代码不同&#xff0c;考察的内容是完全相同的&#xff0c;选一个就行。建议Java&#xff0c;因为老程序员最近用的Java肯定对。 题目考察形式为给出类图描述和几乎全部代码&#xff0c;考生关键代码填空即可。 某软件公司…

【数据结构】简单认识:堆

数据结构&#xff1a;堆堆1.堆是什么&#xff1f;2.堆的特性。3.堆的操作原理①堆的插入原理②堆的删除原理堆 1.堆是什么&#xff1f; 堆是特殊的队列&#xff0c;不同于普通队列&#xff0c;从堆中取出元素是依照元素的优先级大小&#xff0c;而不是元素进入队列的先后顺序…

计算机毕业设计(附源码)python疫情防控管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

阿里/华为云服务器centos7.5 java部署环境快速搭建一条龙【git、maven、jdk8、docker安装nginx、mysql、redis】

文章目录linux常用命令汇总视频教程云服务器搭建java部署环境1.安装配置git2.安装jdk和maven下载安装3.安装docker4.安装docker-compose5.编排nginx6.编排mysql7.编排redislinux常用命令汇总 linux常用命令汇总 视频教程 云服务器java环境搭建一条龙&#xff08;1&#xff0…