- 根据可达性分析找出存活对象,从GC Roots开始遍历访问。
-
将遇到的对象按是否访问过分三个颜色(黑白灰)
2.1 白色:尚未访问
2.2 黑色:表示当前对象已经被访问,且当前对象直接引用的其他对象也都被访问了。(当前对象及其所有直接可达对象都被访问)
2.3 灰色:表示当前对象已经被访问,但是当前对象直接引用的对象尚未完全访问到,全部访问后变为黑色。(当前对象直接可达对象没有全部被访问)
三色标记 - 一次完整的三色标记
3.1 初始 所有对象都是白色
3.2 将GC Roots的直接引用对象移到【灰色集合】中
3.3 从【灰色集合】中获取对象,将当前对象引用到的对象移动到【灰色集合】中,将当前对象移动到【黑色集合】中
3.4 重复步骤3,直到【灰色集合】为空
3.5 结束后(【灰色集合】为空),仍然在【白色集合】中的对象就是GC Roots不可达对象,可以进行回收。 -
产生问题
4.1 浮动垃圾:垃圾回收线程暂停,业务线程继续,B对象指向D对象的引用消失,D变成垃圾,可以回收D(由于浮动垃圾的存在,因此CMS不建议内存满了在回收,可以配置达到总空间的百分之n的时候进行回收)。
浮动垃圾
4.2 漏标:垃圾回收线程暂停,业务线程继续,此时A对象指向D,B对象和D对象之间的引用消失。在此时又继续运行垃圾回收线程,A对象此时在【黑色集合】中,不会被遍历了,B对象在【灰色集合】中,会再次进行标记其所引用的对象,但是这时B、D之间的引用已经消失了,无法寻找到D,因此在标记结束后,D还在【白色集合】中,垃圾回收线程认为D是垃圾将D回收了,业务线程使用D时候产生null。
漏标
网友评论