其他分享
首页 > 其他分享> > 什么是浮动垃圾 CMS为什么要重新标记 G1是怎么优化重新标记的过程的

什么是浮动垃圾 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 )

 

 

标签:黑色,G1,标记,遍历,GC,线程,CMS,节点
来源: https://www.cnblogs.com/cxygg/p/16157778.html