G1垃圾收集器之SATB
本文来说下G1垃圾收集器之SATB
文章目录
- 对象漏标
- SATB
- 本文小结
对象漏标
垃圾回收的并发标记阶段,gc线程和应用线程是并发执行的,所以一个对象被标记之后,应用线程可能篡改对象的引用关系,从而造成对象的漏标、误标,其实误标没什么关系,顶多造成浮动垃圾,在下次gc还是可以回收的,但是漏标的后果是致命的,把本应该存活的对象给回收了,从而影响的程序的正确性。
为了解决在并发标记过程中,存活对象漏标的情况,GC HandBook把对象分成三种颜色:
- 黑色:自身以及可达对象都已经被标记
- 灰色:自身被标记,可达对象还未标记
- 白色:还未被标记
所以,漏标的情况只会发生在白色对象中,且满足以下任意一个条件:
- 并发标记时,应用线程给一个黑色对象的引用类型字段赋值了该白色对象
- 并发标记时,应用线程删除所有灰色对象到该白色对象的引用
对于第一种情况,利用post-write barrier,记录所有新增的引用关系,然后根据这些引用关系为根重新扫描一遍。对于第二种情况,利用pre-write barrier,将所有即将被删除的引用关系的旧引用记录下来,最后以这些旧引用为根重新扫描一遍。
SATB
SATB全称snapshot-at-the-beginning,由Taiichi Yuasa为增量式标记清除垃圾收集器开发的一个算法,主要应用于垃圾收集的并发标记阶段,解决了CMS垃圾收集器重新标记阶段长时间STW的潜在风险。Region包含了5个指针,分别是bottom、previous TAMS、next TAMS、top和end,
SATB保证了在并发标记过程中新分配对象不会漏标
但如果在TAMS之前有一个白色对象W,被一个灰色对象G引用,在并发标记扫描到这个字段之前被赋值为null,切断了对象W和对象G之间的引用关系,对象W就有可能漏标,这就是白色对象被漏标的第二种情况?G1中如何解决?在引用关系被修改之前,插入一层 pre-write barrier。
pre-write barrier最终执行逻辑:
通过G1SATBCardTableModRefBS::enqueue(oop pre_val)把原引用保存到satb mark queue中,和RSet的实现类似,每个应用线程都自带一个satb mark queue。在下一次的并发标记阶段,会依次处理satb mark queue中的对象,确保这部分对象在本轮GC是存活的。
本文小结
本文详细介绍了G1垃圾收集器中的SATB机制。
G1垃圾收集器之SATB相关推荐
- G1垃圾收集器之对象分配过程
本文来说下G1垃圾收集器之对象分配过程 文章目录 概述 小对象 大对象 本文小结 概述 G1的年轻代由eden region 和 survivor region 两部分组成,新建的对象(除了巨型对象) ...
- G1垃圾收集器之RSet
本文来说下G1垃圾收集器之RSet 文章目录 堆内存 Region RSet RSet实现过程 RSet有什么好处 RSet有什么风险 本文小结 堆内存 在G1的垃圾回收算法中,堆内存采用了另外一种完 ...
- JAVA垃圾收集器之G1
Garbage First(G1)收集器 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式 ...
- G1垃圾收集器深度剖析
G1垃圾收集器深度剖析 一.G1垃圾收集器概述 1.1 思考 开始学习前,抛出两个常见面试问题:1.G1的回收原理是什么?为什么G1比传统的GC回收性能好?2.为什么G1如此完美仍然会有ZGC?简单的 ...
- 【JVM】G1垃圾收集器知多少
前言 在JDK 9中G1取代Parallel Scavenge加Parallel Old组合,成为服务端模式下的默认垃圾收集器,而CMS则沦落至被声明为不推荐使用(Deprecate)的收集器.本文主 ...
- 转:深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
- 深入理解 Java G1 垃圾收集器--转
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...
- 深入理解 Java G1 垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
- G1 垃圾收集器原理详解
一.G1 垃圾收集器的开发背景: 1.CMS 垃圾收集器的缺陷: JVM 团队设计出 G1 收集器的目的就是取代 CMS 收集器,因为 CMS 收集器在很多场景下存在诸多问题,缺陷暴露无遗,具体如下: ...
最新文章
- 重磅!库克官宣苹果放弃英特尔,全面采用自研芯片,MAC迎来历史转折点
- 信纳比(SINAD)介绍
- 互联网泛娱乐直播安全的解决之道
- 专家:我国青少年网络安全立法还需完善
- linux命令解释程序实验,实验二 命令解释程序的使用
- tensorflow支持python3.7吗_TensorFlow2.1正式版上线:最后一次支持Python2,进一步支持TPU...
- git 修改默认分支为main_Git:基本操作
- C语言霍夫曼编码压缩,数据结构大作业——哈夫曼编码压缩BMP格式文件
- Eclipse设置中文汉化
- javaSocket编程TCP
- 记录:ubuntu安装zlog及使用
- kubernetes 创建pod /merged/dev/shm: invalid argument
- TKinter —— GUI in python 4. Handing User Event 小组件 赋功能 (概念 必看!)
- PS之基础知识汇总(总结版)
- 在键盘上怎么点出来上下居中的点?
- java实现将将时间段分成8段,判断当前时间在哪一段时间里?
- 韩顺平老师的linux基础课(复习笔记)
- 【闲趣】你的父母有哪些神操作?
- Qt for MCUs 1.9正式发布
- 17届智能车-湖科逐梦四队硬件开源
热门文章
- (十三)java多线程之Timer
- 用Mindjet MindManager 15 打开文件后停止响应的解决方法
- 2015.12.08-2015.12.11 硕士毕业大论文 前端技术学习
- amazon 设计 4 vending machine
- c#遍历一个文件夹下的所有文件包括子文件夹【原】
- Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
- SQL Server 2017 AlwaysOn AG 自动初始化(十二)
- Android实现ListView(2)
- jsp和mysql乱码
- Oracle中关于并集/交集/差集的运算