CMS的三色标记,我想大家都不陌生了吧(不会有人不懂吧😁)
三色标记
三色标记,分为白色,黑色,灰色。每种颜色代表的是不同的含义。
白色代表,此节点还没有被gc给扫描过。
黑色代表,此节点已经扫描完毕。
灰色代表,此节点只是别扫描了一部分,未完全扫描完。
为什么不是两色标记,而是三色标记,这个灰色能不能去掉?
首先这个灰色是不能去掉滴。众所周知CMS的过程分为:初始标记,并发标记,重新标记,并发清除。
这个问题就是出在并发清除这一步,并发清除是垃圾收集线程和用户线程并发执行,因为是并发,所以就会出现cpu的争夺。这个时候就涉及到cpu的时间片轮转了。
如果到gc正在扫描一个节点的时候,扫描到一半的时候,cpu的时间片到期,这时gc扫描只能先停下来,这个时候问题来了,这个节点标位什么颜色呢?
肯定是不能标为黑色的,因为此节点还没有扫描完,如果标为白色,那么下次时间片的时候,此节点又要重新扫描了,会造成时间片的浪费。因此这个时候就需要灰色了,将节点定义为灰色,下次时间片到达时,接着扫描节点就行。
笔者的见解可能有着不足之处,还望大佬们不吝赐教。