什么是浮动垃圾 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 )
posted on 2022-04-17 22:49 zhangyukun 阅读(915) 评论(0) 编辑 收藏 举报