美文网首页
三色标记法

三色标记法

作者: 糯米团子123 | 来源:发表于2022-10-17 18:21 被阅读0次
    1. 根据可达性分析找出存活对象,从GC Roots开始遍历访问。
    2. 将遇到的对象按是否访问过分三个颜色(黑白灰)
      2.1 白色:尚未访问
      2.2 黑色:表示当前对象已经被访问,且当前对象直接引用的其他对象也都被访问了。(当前对象及其所有直接可达对象都被访问)
      2.3 灰色:表示当前对象已经被访问,但是当前对象直接引用的对象尚未完全访问到,全部访问后变为黑色。(当前对象直接可达对象没有全部被访问)


      三色标记
    3. 一次完整的三色标记
      3.1 初始 所有对象都是白色
      3.2 将GC Roots的直接引用对象移到【灰色集合】中
      3.3 从【灰色集合】中获取对象,将当前对象引用到的对象移动到【灰色集合】中,将当前对象移动到【黑色集合】中
      3.4 重复步骤3,直到【灰色集合】为空
      3.5 结束后(【灰色集合】为空),仍然在【白色集合】中的对象就是GC Roots不可达对象,可以进行回收。
    4. 产生问题
      4.1 浮动垃圾:垃圾回收线程暂停,业务线程继续,B对象指向D对象的引用消失,D变成垃圾,可以回收D(由于浮动垃圾的存在,因此CMS不建议内存满了在回收,可以配置达到总空间的百分之n的时候进行回收)。


      浮动垃圾

    4.2 漏标:垃圾回收线程暂停,业务线程继续,此时A对象指向D,B对象和D对象之间的引用消失。在此时又继续运行垃圾回收线程,A对象此时在【黑色集合】中,不会被遍历了,B对象在【灰色集合】中,会再次进行标记其所引用的对象,但是这时B、D之间的引用已经消失了,无法寻找到D,因此在标记结束后,D还在【白色集合】中,垃圾回收线程认为D是垃圾将D回收了,业务线程使用D时候产生null。


    漏标

    相关文章

      网友评论

          本文标题:三色标记法

          本文链接:https://www.haomeiwen.com/subject/wucvortx.html