所谓三色标记法,是GC在进行垃圾回收前,对哪些对象需要进行回收、哪些对象不需要进行回收的一种标记方式,便于垃圾回收器进行垃圾回收。
三色标记法将对象的颜色分为:
三色标记法在实际中会结合可达性分析算法来使用,具体流程如下:
这里还会引申出一个问题,三色标记法中的并发漏标问题是怎么处理的?在讲这个问题前,首先讲一讲为什么会出现并发漏标问题:
在早期的垃圾回收器中,用户线程和垃圾回收线程是不能并发执行的,只要垃圾回收线程在运行,那么用户线程就得暂停,这也就是所谓的Stop The World,那么这样肯定是不行的,所以现在的垃圾回收器都在朝着并发执行的方向做努力 ,现有的垃圾回收器可以在垃圾回收的某些阶段实现并发,比如在对老年代的对象进行标记时,不会阻塞用户线程,但是这样也就带来了一个新的问题,即并发漏标问题,所谓的并发漏标问题简单来说就是,用户线程在垃圾回收器工作时修改了某个对象引用带来的问题,常见场景如下:
那么漏标问题是如何解决的呢?CMS 垃圾回收器和 G1 垃圾回收器给出了不同的解决方案
增量更新法(Incremental Update )
CMS垃圾回收器采用的解决方案,主要思路是,将整个标记过程分为两个阶段,一是并发标记阶段,二是重新标记阶段,在并发标记阶段,还是会使用三色标记法对所有可达对象进行标记,但是区别在于,一旦这些对象发生赋值动作时就会被拦截,如果该对象是黑色的,就会将其标记为灰色,当所有标记完成后,就会Stop The World,进入重新标记阶段,然后再对这些灰色的对象进行处理。
这种方案并不能完全避免漏标问题,如果一个灰色对象已经被标记的属性指向了一个白色对象,垃圾回收器拦截赋值动作时发现该对象是灰色对象,则并不会对其进行处理,那么当这个对象所有的属性被标记结束后,由灰色变成了黑色,那么这个对象引用的白色对象就无法被标记,进而漏标
SATB(Snapshot At The Beginning)原始快照法
G1垃圾回收器采用的解决方案,同样是将整个标记过程分成并发标记和重新标记两个阶段,在并发标记阶段,会将所有被断开的引用或者新增的引用记录下来,此时这些引用在垃圾回收器眼中是白色的,在所有标记结束后,会Stop The World,然后在重新标记阶段扫描这些白色的对象,检查其是否被引用,若未被引用则直接回收,若被引用了则标记为黑色
上一篇:关于vue中使用全局变量的问题
下一篇:大数据数仓高级面试题 3