本文来说下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相关推荐

  1. G1垃圾收集器之对象分配过程

    本文来说下G1垃圾收集器之对象分配过程 文章目录 概述 小对象 大对象 本文小结 概述 G1的年轻代由eden region 和 survivor region 两部分组成,新建的对象(除了巨型对象) ...

  2. G1垃圾收集器之RSet

    本文来说下G1垃圾收集器之RSet 文章目录 堆内存 Region RSet RSet实现过程 RSet有什么好处 RSet有什么风险 本文小结 堆内存 在G1的垃圾回收算法中,堆内存采用了另外一种完 ...

  3. JAVA垃圾收集器之G1

    Garbage First(G1)收集器 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式 ...

  4. G1垃圾收集器深度剖析

    G1垃圾收集器深度剖析 一.G1垃圾收集器概述 1.1 思考 开始学习前,抛出两个常见面试问题:1.G1的回收原理是什么?为什么G1比传统的GC回收性能好?2.为什么G1如此完美仍然会有ZGC?简单的 ...

  5. 【JVM】G1垃圾收集器知多少

    前言 在JDK 9中G1取代Parallel Scavenge加Parallel Old组合,成为服务端模式下的默认垃圾收集器,而CMS则沦落至被声明为不推荐使用(Deprecate)的收集器.本文主 ...

  6. 转:深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  7. 深入理解 Java G1 垃圾收集器--转

    原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...

  8. 深入理解 Java G1 垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  9. G1 垃圾收集器原理详解

    一.G1 垃圾收集器的开发背景: 1.CMS 垃圾收集器的缺陷: JVM 团队设计出 G1 收集器的目的就是取代 CMS 收集器,因为 CMS 收集器在很多场景下存在诸多问题,缺陷暴露无遗,具体如下: ...

最新文章

  1. 重磅!库克官宣苹果放弃英特尔,全面采用自研芯片,MAC迎来历史转折点
  2. 信纳比(SINAD)介绍
  3. 互联网泛娱乐直播安全的解决之道
  4. 专家:我国青少年网络安全立法还需完善
  5. linux命令解释程序实验,实验二 命令解释程序的使用
  6. tensorflow支持python3.7吗_TensorFlow2.1正式版上线:最后一次支持Python2,进一步支持TPU...
  7. git 修改默认分支为main_Git:基本操作
  8. C语言霍夫曼编码压缩,数据结构大作业——哈夫曼编码压缩BMP格式文件
  9. Eclipse设置中文汉化
  10. javaSocket编程TCP
  11. 记录:ubuntu安装zlog及使用
  12. kubernetes 创建pod /merged/dev/shm: invalid argument
  13. TKinter —— GUI in python  4. Handing User Event 小组件 赋功能 (概念 必看!)
  14. PS之基础知识汇总(总结版)
  15. 在键盘上怎么点出来上下居中的点?
  16. java实现将将时间段分成8段,判断当前时间在哪一段时间里?
  17. 韩顺平老师的linux基础课(复习笔记)
  18. 【闲趣】你的父母有哪些神操作?
  19. Qt for MCUs 1.9正式发布
  20. 17届智能车-湖科逐梦四队硬件开源

热门文章

  1. (十三)java多线程之Timer
  2. 用Mindjet MindManager 15 打开文件后停止响应的解决方法
  3. 2015.12.08-2015.12.11 硕士毕业大论文 前端技术学习
  4. amazon 设计 4 vending machine
  5. c#遍历一个文件夹下的所有文件包括子文件夹【原】
  6. Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
  7. SQL Server 2017 AlwaysOn AG 自动初始化(十二)
  8. Android实现ListView(2)
  9. jsp和mysql乱码
  10. Oracle中关于并集/交集/差集的运算