三色标记法详解

发布于:2024-05-08 ⋅ 阅读:(24) ⋅ 点赞:(0)

  什么是三色标记法

        三色标记法(Three-color Marking)是一种在垃圾回收(Garbage Collection, GC)领域广泛使用的算法,尤其是在Java虚拟机(JVM)中,与追踪式垃圾回收相关联。它的核心目的是为了高效且准确地识别出哪些对象在内存中是可达的(即还在被程序使用),哪些是不可达的(可以被回收)。该算法基于对象的可达性分析,将对象标记为三种颜色之一:白色、灰色、黑色,以此来表示垃圾回收过程中的不同状态        

白色:该对象没有被标记过。
灰色:该对象已经被标记过了,但该对象的引用对象还没标记完。
黑色:该对象已经被标记过了,并且他的全部引用对象也都标记完了。

在出现三色标记算法之前,JVM中垃圾对象的标记主要采用可达性分析算法及引用计数法。但是这两种算法存在以下问题:

1、循环引用问题,如果两个对象互相引用,就形成了一个环形结构,如果采用引用计数法的话,那么这两个对象将永远无法被回收。

2、STW时间长,可达性分析的整个过程都需要STW,以避免对象的状态发生改变,这就导致GC停顿时长很长,大大影响应用的整体性能。

        三色标记法可以在不同类型的垃圾回收器中实现,如CMS(Concurrent Mark-Sweep)和G1(Garbage First)中,尤其是那些追求减少“Stop-The-World”暂停时间的收集器,通过并发标记的方式提高应用的响应速度。该算法的设计旨在最小化垃圾回收过程对应用运行的影响,通过与应用程序线程并发执行标记过程来达成这一目标。

三色标记法的标记过程可以分为三个阶段:初始标记(Initial Marking)、并发标记(Concurrent Marking)和重新标记(Remark)。

初始标记:遍历所有的根对象,将根对象和直接引用的对象标记为灰色。在这个阶段中,垃圾回收器只会扫描被直接或者间接引用的对象,而不会扫描整个堆。因此,初始标记阶段的时间比较短。(Stop The World)

并发标记:在这个过程中,垃圾回收器会从灰色对象开始遍历整个对象图,将被引用的对象标记为灰色,并将已经遍历过的对象标记为黑色。并发标记过程中,应用程序线程可能会修改对象图,因此垃圾回收器需要使用写屏障(Write Barrier)技术来保证并发标记的正确性。(不需要STW)

重新标记:重新标记的主要作用是标记在并发标记阶段中被修改的对象以及未被遍历到的对象。这个过程中,垃圾回收器会从灰色对象重新开始遍历对象图,将被引用的对象标记为灰色,并将已经遍历过的对象标记为黑色。(Stop The World)

在重新标记阶段结束之后,垃圾回收器会执行清除操作,将未被标记为可达对象的对象进行回收,从而释放内存空间。这个过程中,垃圾回收器会将所有未被标记的对象标记为白色(White)。

以上三个标记阶段中,初始标记和重新标记是需要STW的,而并发标记是不需要STW的。其中最耗时的其实就是并发标记的这个阶段,因为这个阶段需要遍历整个对象树,而三色标记把这个阶段做到了和应用线程并发执行,大大降低了GC的停顿时长。


网站公告

今日签到

点亮在社区的每一天
去签到