美文网首页
三色标记法

三色标记法

作者: 晚歌歌 | 来源:发表于2021-07-14 17:16 被阅读0次

背景

相比之前的标记清除算法,其GC执行期间需要把整个程序完全暂停,不能异步执行GC操作。对实时性要求比较高的系统来说,这种需要长时间挂起的标记清除算法是不可接受的,而三色标记算法就很好的解决了这个问题。

三色标记最大的好处是可以异步执行,从而可以以中断时间极少的代价或者完全没有中断操作来进行整个GC。

定义

黑色:根对象,或者该对象与它的子对象都被扫描过。
灰色:对象本身被扫描,但是还有没扫描该对象的子对象。
白色:未被扫描的对象,如果扫描完成所有对象之后,最终为白色的为不可达对象,即垃圾对象。

漏标问题

image.png

什么时候,会产生对象消失的问题,即原本应该是黑色的对象被误标为白色?

当且仅当以下两个条件同时满足:
赋值器插入了一条或多条从黑色对象到白色对象的新引用;
赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。

解决

只需要破坏这两个条件任意一个即可,两种解决方案:
增量更新(Increamental Update)和原始快照(Snap shot At The Begining, SATB)

增量更新

CMS 基于 增量更新(Increamental Update)来做并发标记

增量更新(Increamental Update):当黑色指向白色的引用被建立时,就利用写屏障将这个新的引用关系记录下来,等扫描结束后,再以这些记录中的黑色对象为根,重新扫描一次。相当于黑色对象一旦建立了指向白色对象的引用,就会变为灰色对象。

不会产生浮动垃圾,但是重新扫描灰色对象的效率较低

原始快照

G1 基于 原始快照(Snap shot At The Begining, SATB)来实现的

原始快照(Snap shot At The Begining, SATB):原始快照要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的白色对象作为灰色对象,重新扫描一次

会产生浮动垃圾,但是无需扫描整个引用链效率较高

对比增量更新和原始快照

原始快照关注的是引用删除,增量更新关注的是引用增加。

为啥G1不使用增量更新算法

因为使用增量更新算法,那变成灰色的对象还要重新扫描一遍,效率太低了,所以G1在处理并发标记的过程比CMS效率要高,这个主要是解决漏标的算法决定的。

相关文章

  • JVM学习12·垃圾回收器以及HotSpot的实现细节

    1.并发标记与三色标记 在三色标记法之前有一个算法叫Mark-And-Sweep(标记清除)。这个算法会设置一个标...

  • 三色标记法与读写屏障

    前言 本文主要介绍了三色标记法的基本思路、多标导致的浮动垃圾、漏标的处理方案(读写屏障)等。 1. 垃圾回收的简单...

  • 三年级数学学习方法的培养

    1,审题。 审题一定要仔细,重要信息做标记。 三色笔记法,黑色,蓝色,红笔。康奈尔笔记法。 ...

  • 垃圾回收器串讲及 HotSpot 的细节实现

    并发标记与三色标记 三色标记 在三色标记法之前有一个算法叫 Mark-And-Sweep(标记清除)。这个算法会设...

  • CMS解决三色标记法漏标问题

    通常采用方案:发生A对象(黑色集合)指向D对象(白色集合)时候,直接将D对象标灰(业务线程运行,一旦发生黑色标记指...

  • 三色标记法

    CMS - 采用方法1 增量更新,关注引用的增加。效率较低,因为其要重新扫描灰色的所有子引用 G1 - 采用方法2...

  • 三色标记法

    背景 相比之前的标记清除算法,其GC执行期间需要把整个程序完全暂停,不能异步执行GC操作。对实时性要求比较高的系统...

  • 三色标记法

    根据可达性分析找出存活对象,从GC Roots开始遍历访问。 将遇到的对象按是否访问过分三个颜色(黑白灰)2.1 ...

  • CMS,G1 垃圾回收器中的三色标记了解吗?

    三色标记算法思想 三色标记法是一种垃圾回收法,它可以让 JVM 不发生或仅短时间发生 STW(Stop The W...

  • lua gc算法(2)

    三色标记法 在前面的双色标记法中,我们可以看到一个对象可以分为白色和黑色。现在引入一个灰色的概念,标记那些已经被扫...

网友评论

      本文标题:三色标记法

      本文链接:https://www.haomeiwen.com/subject/dowypltx.html