当前位置:网站首页>并发的可达性分析(三色标记法)
并发的可达性分析(三色标记法)
2022-04-22 22:12:00 【过街的老鼠】
当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象 是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析, 这意味着必须全程冻结用户线程的运行。
为了减少冻结用户线程的影响,提高效率,采用并发标记的方法
并发标记的作用
根据 可达性分析算法 的核心概念,利用系列根对象(GC Roots )作为起始点,根据对象之间的引用关系搜索出一条引用链,通过遍历引用链来判断对象的是否存活。
在这个过程中,根对象枚举的时间非常短暂且相对固定,然而,遍历所有引用链(对象图)所需要的时间与对象的数量成正比。因此,对象越多,对象之间的引用关系就越复杂,需要更多的时间去遍历所有的引用链来标记所有的对象。
并发标记的作用就是让垃圾回收线程和用户线程能够同时进行,并发执行。
下面用三色标记法进行说明
三色标记法
-
白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是 白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达
-
黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代 表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍。黑色对 象不可能直接(不经过灰色对象)指向某个白色对象。
-
灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过,也就是还可以继续扫描


当且仅当以下两个条件同时满足时,会产生“对象消失”的问 题,即原本应该是黑色的对象被误标为白色:
-
插入了一条或多条从黑色对象到白色对象的新引用
-
删除了全部从灰色对象到该白色对象的直接或间接引用
解决方案
增量更新要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时,就将这个新 插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫 描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后,它就变回灰色对象 了。
原始快照要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删 除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描 一次。这也可以简化理解为,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来 进行搜索。
版权声明
本文为[过街的老鼠]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_51212267/article/details/124351876
边栏推荐
- 多层感知机的从零开始实现( 从D2L 包中抽取函数)
- 对话杨炯纬,快体现在抓住“红利”上,实际上TO B公司应该跑得慢一点
- LLVM 学习(一) -初识LLVM
- 知识图谱开篇笔记
- 外部中断---------stm32f407zet6
- 10万开发者涌入“酷应用”,钉钉押注场景化
- 未来可期,PlatoFarm的生态通证登录Bitmart等全球四大平台
- Implementation of multi-layer perceptron from scratch (extracting function from D2L package)
- Flex layout
- [Luogu] p1162 filling color (BFS)
猜你喜欢

appinventor2在window上搭建步骤

Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Rasa全新全局词槽映射的 3 大方法

MySql内置函数

TOOLS. INI‘does not contain a valid tool path

Lecture recording and broadcasting | subgraph matching algorithm in graph database - Zou Lei

0基础UnityURP渲染管线之阴影ShadowCaster-ShadowMask-Map傻傻分不清楚(代码向)

CAS统一身份认证(三):外部独立配置

JVM性能调优1

Take you to understand the principle of highly flexible spark architecture

Steps to build appinventor2 on the window
随机推荐
MySql--- 数据类型
Centos7安装mysql
【微信小程序开发(云壁纸小程序教程)】
根据这个有效方法,UI自动化测试就是那么的简单
赛微微电上市首日破发:市值蒸发超15亿元,经营规模略输一筹
High end beer is losing young people
kubeflow创建新用户用户密码
vickers威格士比例阀的特点
OV代码签名和EV代码签名证书区别
多层感知机的从零开始实现( 从D2L 包中抽取函数)
LLVM 学习(一) -初识LLVM
Regular expression of JS
0基础UnityURP渲染管线之阴影ShadowCaster-ShadowMask-Map傻傻分不清楚(代码向)
多线程进阶(八)----线程池
PMP证书到期了有必要续吗
GBase 8s V8.8 SQL 指南:教程-6.2.2(1)
高端啤酒正在失去年轻人
Graph and numerical representation of knowledge map of knowledge representation
A simple and easy-to-use file upload scheme
接续符介绍及用法和++和--操作符分析介绍及用法