• 什么是浮动垃圾 CMS为什么要重新标记 G1是怎么优化重新标记的过程的


    1 浮动垃圾 如图,GC 线程便利对象树(实际是图),遍历过了A ,然后遍历过了B,遍历到了C,但是还没有遍历完C的儿子D,这时候如果 A.B=null; 那么B就变成了浮动垃圾,本次GC 过程B不会被清除。只能下次清除。

    2 GC 三色标记算法过程中,白色的节点指向 黑色的节点 怎么办? (增量更新,和写屏障)

      直接把黑色变成灰色,这是浮动垃圾吗?不是,因为黑色节点变成了灰色,GC线程每次暂停后开始都会重灰色线程开始,也就是说黑色变成灰色以后,会重新便利这个灰色和下面的非黑色节点。

    3 三色算法为什么要重新标记,便利灰色节点的子节点过程中,如果已经被遍历的子节点(已经被遍历过的子节点可能是黑色或者灰色)被指向了一个白色节点A.B=E ,然后这个B位置变成了白色的E,黑色的E变成了浮动垃圾。

    如果直接删除B不会被删除,但是E会被删除,我们希望的E不会删除,B 被删除,B浮动垃圾下次GC在删除没问题,E 肯定不能删除,所有需要重新标记一边(这时候只能暂停业务线程(STW),不然又会出现类似的情况),重新标记只遍历黑色节点,看看下面是否有白色节点,有就标记成黑色。因为GC 这个过程实际有标记成黑色的一般比较少,所以比并发标记的对象少很多,速度要快一些,但是也标记了2次。

      

    4 G1 怎么处理三色标记算法

      在上面图 A.B=E 的过程中,G1 把这个数据记录下来,编发标记完了不是去遍历所有黑色,而是去遍历 记录的 那份数据,这时候记录的数据 里面有个白色的E,只要通过分区集合找到 有关联的分区中如果有父黑色的节点指向

    这个白色的E,有就标记成黑色,如果没有就保持白色(保持白色,是这个过程中业务线程把 A.E= null )

     

  • 相关阅读:
    利用 PHP 导出 Git 某个分支下,新增或修改过的文件
    [翻译] 10 个实用的 Git 高级命令
    Django web project
    install virtualenv
    js原型继承
    HTML 学习杂记
    IDEA 文件列表隐藏某后缀文件
    coocsCreator杂记
    mac install brew
    c编程:输入一个数字n,则n代表n行,每行输入2个数字a,b计算每行的a+b问题。
  • 原文地址:https://www.cnblogs.com/cxygg/p/16157778.html
Copyright © 2020-2023  润新知