三色标记算法

三色标记算法

GC---> 标记(可达性算法)---> 根据不同算法去处理回收

STW:GC时对程序暂停处理下垃圾。不暂停,就会一直制造垃圾,清理不干净。暂停就会阻塞期间请求,影响系统性能

三色标记:减少标记时间,将标记阶段异步标记,标记完了再STW,减少STW时间

三色标记算法:

1.用于垃圾回收器升级,将STW变为并发标记。STW就是在标记垃圾的时候,必须暂停程序,而使用并发标记,就是程序一边运行,一边标记垃圾。

2避免重复扫描对象,提升标记阶段的效率

1. 什么是三色:

首先我们需要知道三色标记法就是根据可达性分析 ,从GC Roots开始进行遍历访问,在遍历对象过程中,按"是否检查过"这个条件将对象标记成三种颜色:

**白色:**该对象没有被标记过。(对象垃圾)

**灰色:**该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾)

**黑色:**该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象)

2. 三色标记过程:

假设现在有白、灰、黑三个集合(表示当前对象的颜色),其遍历访问过程为:

初始时,所有对象都在【白色集合】中;

将 GC Roots直接引用到的对象挪到【灰色集合】中;

从灰色集合中获取对象:

3.1. 将本对象引用到的其他对象全部挪到【灰色集合】中;

3.2. 将本对象挪到【黑色集合】里面。

重复步骤3,直至【灰色集合】为空时结束。

结束后,仍在【白色集合】的对象即为GC Roots不可达,可以进行回收。

<!--需要注意,传统标记方式发生Stop The World时,对象间的引用是不会发生变化的,可以轻松完成标记。 而并发标记在标记期间应用线程还在继续跑,对象间的引用可能发生变化,就会出现错标和漏标的情况就有可能发生。-->

3.存在的问题

浮动垃圾: 并发标记的过程中,若一个已经被标记成黑色或者灰色的对象,突然变成了垃圾,由于不会再对黑色标记过的对象重新扫描,所以不会被发现,那么这个对象不是白色的但是不会被清除,重新标记也不能从GC Root中去找到,所以成为了浮动垃圾,浮动垃圾对系统的影响不大,留给下一次GC进行处理即可。

对象漏标问题 (需要的对象被回收):并发标记的过程中,一个业务线程将一个未被扫描过的白色对象断开引用成为垃圾(删除引用),同时黑色对象引用了该对象(增加引用)(这两部可以不分先后顺序);因为黑色对象的含义为其属性都已经被标记过了,重新标记也不会从黑色对象中去找,导致该对象被程序所需要,却又要被GC回收,此问题会导致系统出现问题,而CMS与G1,两种回收器在使用三色标记法时,都采取了一些措施来应对这些问题,CMS对增加引用环节进行处理(Increment Update),G1则对删除引用环节进行处理(SATB)

4.总结

三色标记算法是根可达算法的一种实现方案,其目的是为了找出所有可达对象。三色标记算法会产生多标和漏标问题,其中漏标问题最严重。漏标问题会导致本该存活的对象被回收,从而导致严重的程序问题。

借鉴:B站徐庶老师

相关推荐
路口游子7 分钟前
unresolved external symbol _ossl_ed25519_keymgmt_functions
java·服务器·前端
vibag9 分钟前
Hadoop(HDFS)
java·大数据·hadoop·hdfs
路口游子15 分钟前
_ossl_ed25519_keymgmt_functions
java·开发语言·算法
qtvb19871 小时前
推荐JDK1.8 API 中文文档
java
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】摔跤识别数据集 5097 张,YOLO行人摔倒识别算法实战训练教程!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
开源哥662 小时前
【含文档】基于ssm+jsp的高校成绩报送系统(含源码+数据库+lw)
java·开发语言·数据库
正在敲代码中2 小时前
[Code+#1] 晨跑
算法
码农不惑2 小时前
转化古老的Eclipse项目为使用gradle构建
java·ide·eclipse·gradle
Code成立2 小时前
《Java核心技术 卷I》JFrame组件中显示信息
java·前端·python
带带琪宝2 小时前
决策树(部分)
算法·决策树·机器学习