当前位置:网站首页>G1和CMS的三色标记法及漏标问题
G1和CMS的三色标记法及漏标问题
2022-08-10 12:09:00 【祁_z】
首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记 -> (拷贝存活区域对象)
初始标记: 只会标记GCRoot直接关联的对象
并发标记: 基于初始标记时标记的对象作为起点, 标记所有(属性)关联的对象
最终标记: 处理漏标问题 (并发标记阶段, 漏标的GCRoot可达的对象)
什么是三色标记
标记复制算法中的标记阶段所用到的标记算法(三色标记算法);
GC如果想查找到存活的对象,根据GCRoot可达分析算法 根据GCRoot引用链遍历存活对象。根据GCRoot遍历过程中, 按照是否访问过该对象 分为三种不同颜色。
白色:本对象没有访问过(没有被GCRoot扫描过)(有可能是为垃圾对象);
灰色:本对象已经被访问过(被GCRoot扫描过),且本对象的所有属性没有访问过;本对象所有属性都访问过后,本对象有灰色变为黑色。
黑色:本对象已经被访问过(被GCRoot扫描过),且本对象的所有属性都被访问过;

// 演示模型中的对象引用
class B{
private C c;
}
class C{
private D d;
}
class D{
}原理:
- 初始标记时,所有对象都在白色容器中;
- 并发标记时(用户线程与GC线程同时运行),将本对象引用到的其他对象移动灰色容器中,如果本对象没有引用到其他对象或者其他对象已经标记过,则该对象放到黑色容器中。
重复以上这些操作,到灰色容器为空时,则停止。
结束后,如果在白色容器中任然存在的对象,则认为就是与GCRoot没有直接关联,则认为就是为不可达对象,可以被垃圾回收线程清理。
三色标记法为什么存在漏标问题
在并发标记阶段会出现漏标问题, 由于是GC线程和用户线程同时运行的, 参考下图模型:

当遍历的C对象的时候,C对象已经存放到灰色容器中,突然用户线程修改C对象属性.E=Null; E对象与C对象断开,则E对象为垃圾对象,但是用户线程修改B对象的属性=E对象,在进行最终标记阶段时B对象已经为黑色不会继续遍历B对象,就会导致E对象会被垃圾线程清理,这个过程称作为漏标问题。
C.属性E=null;B.属性E=E;
漏标的问题满足两个条件:
1. 至少有一个黑色对象指向了白色对象
2. 所有灰色对象扫描完整个链时,删除之前所有的白色对象。
参考上图"漏标问题-模型",可能出现以下两种情况:
在并发标记阶段的时候, 用户线程与GC线程同时运行;
条件: GCRoot遍历到C节点, C节点变为灰色, B节点变为黑色
情况1: GC线程先执行, 扫描到E对象, 为可达对象, 没有问题 (不会产生漏标问题)
情况2: 1.用户线程执行灰色对象C.E=null
2.GCRoot线程在执行的时候无法扫描到E对象,E对象是一个垃圾对象
3.用户线程执行黑色对象B.E=E (导致漏标问题)
漏标解决方案
G1收集器中处理漏标问题 (原始快照SATB)
- 原始快照简单理解为备份 (备份被断开引用的白色对象)
如果用户线程在灰色C对象断开一个白色E对象的时候, 会记录原始快照(断开的白色E对象),
在重新标记阶段时候比白色E对象变为灰色为起始点扫描整个链.
- 好处: B黑色对象引用了E灰色对象, 则直接将E灰色变为黑色, 不用遍历整个引用链.
- 坏处: E灰色对象如果为垃圾对象, 则此次垃圾回收不会被清除掉(浮动垃圾), 只能下次清除.
CMS收集器中处理漏标问题(增量更新)
- 简单说就是会重新扫描黑色对象的整个引用链。(关联了白色对象的黑色对象)
满足了第一个条件(灰色对象不在关联白色对象的时候,当黑色对象如果关联了白色对象的时候会记录该黑色对象,
然后在重新标记的时候,将记录的黑色对象变为灰色,从新开始修正标记,但是这种方案能够确保垃圾都被清理,缺点就是效率非常低,
因为会扫描到整个黑色对象所有引用。
- 好处: 不会产生浮动垃圾
- 坏处: 会扫描整个引用链, 比较耗时.
G1和CMS漏标处理对比
G1采用原始快照 - 会产生浮动垃圾, 不会扫描整个引用链, 效率快
CMS采用增量更新 - 不会产生浮动垃圾, 会扫描整个引用链,效率慢,
相对于来说原始快照方式比增量更新方式容易产生浮动垃圾,但是执行效率比增量更新要高。
边栏推荐
- How to do foreign media publicity to grasp the key points
- CURRENT_TIMESTAMP(6) 函数是否存在问题?
- StarRocks on AWS 回顾 | Data Everywhere 系列活动深圳站圆满结束
- [Collection] HashSet and ArrayList lookup Contains() time complexity
- An enhanced dynamic packet buffer management.论文核心部分
- CodeForces - 628D (数位dp)
- 十八、一起学习Lua 调试(Debug)
- 厚积薄发!安全狗再次获得科技成果转化认证!
- A detailed explanation of implementation api embed
- 爱可可AI前沿推介(8.10)
猜你喜欢

LT8911EXB MIPI CSI/DSI to EDP signal conversion

CV复习:空洞卷积

蚂蚁金服+拼多多+抖音+天猫(技术三面)面经合集助你拿大厂offer

dedecms supports one-click import of Word content

Polygon zkEVM工具——PIL和CIRCOM

燃炸!字节跳动成功上岸,只因刷爆LeetCode算法面试题

国外媒体宣发怎样做才可以把握重点

StarRocks on AWS 回顾 | Data Everywhere 系列活动深圳站圆满结束

金山云要飘到哪里?

Does face attendance choose face comparison 1:1 or face search 1:N?
随机推荐
phpstrom 快速注释:
九宫格抽奖动效
正则表达式常用示例
LeetCode 61. Rotating linked list
IDC第一的背后,阿里云在打造怎样的一朵“视频云”?
娄底石油化工实验设计、建设规划概述
2022年8月中国数据库排行榜:openGauss重夺榜眼,PolarDB反超人大金仓
用低代码驱动IT现代化
[Collection] HashSet and ArrayList lookup Contains() time complexity
MySQL索引的B+树到底有多高?
An enhanced dynamic packet buffer management. The core part of the paper
海外媒体宣发.国内媒体发稿要注意哪些问题?
专有云ABC Stack,真正的实力派!
【list合并】多个list合并为一个list
StarRocks on AWS 回顾 | Data Everywhere 系列活动深圳站圆满结束
LeetCode简单题之合并相似的物品
【集合】HashSet和ArrayList的查找Contains()时间复杂度
StarRocks on AWS Review | Data Everywhere Series Event Shenzhen Station ended successfully
Threshold-based filtering buffer management scheme in a shared buffer packet switch core part of the paper
娄底农产品检验实验室建设指南盘点