什么是三色标记
CMS的运行过程中存在并发标记过程,由于不产生STW,所以对垃圾的清理必须存在标记和删除两个过程分开。而不能看到是垃圾就直接清除。否则会引起不必要的麻烦。CMS为了解决这个问题,采用了三色标记算法来记录对象是否已经被扫描过(不是确认为垃圾)。
CMS将对象的标记分为三种颜色,这个颜色只是逻辑上的颜色,在内部存在一个只允许JVM程所修改的两位标记,01代表黑色,10代表灰色,00代表白色。
白色标记:由于遍历过程需要时间,还没有来得及标记的对象为白色。并且最后垃圾也会被标记为白色。
灰色标记:由于一个对象内部有很多成员变量,已经确定该对象不是垃圾而其成员变量并未被扫描,该种对象为灰色对象。
黑色标记:已经确定该对象不是垃圾而且其成员变量已全部被扫描,该种对象为黑色对象。