ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-17 23:03:01  阅读:204  来源: 互联网

标签:黑色 G1 标记 遍历 GC 线程 CMS 节点


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有