ICode9

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

CMS和G1的三色标记清理遗漏对象解决方案

2021-11-07 01:01:34  阅读:139  来源: 互联网

标签:G1 标记 对象 三色 SATB 引用 CMS


why:

  CMS和G1都存在并发标记期间对象引用发生改变,从而导致部分白色对象标记不到(被视为了非活跃对象),被清理掉。

  CMS和G1各自采用了不同的方案来解决。

 

  例如:

  

 

   引用关系改为:B->D的引用,改为了A->D和B->C。

 

how:

  CMS:incremental update算法

    incremental update是如果有一个黑色对象引用到了一个白色对象,即引用终点,即对D来说,引用它的源由原来的B变为了A,是从目标来解决的(A是新引用的最终对象)。通过将黑色对象重新标记为灰色对象,让collecter重新扫描,活着通过mod-union table来标记(即标记过了就不再标记)。

 

  G1: SATB算法:

    SATB认为开始并行标记时活的对象,在本次GC中都是活的对象。B->D的引用改为B->C,通过write barrier写屏障,会将B->D的引用也推入GC遍历的堆栈中标记,从而可以保证D还是能够被标记为活的。相对于D来说,引用它的源由原来的B变为了A,SATB是从源头来解决的(B的引用处开始解决的)。

    如果把B=null,虽然D成了永久垃圾,但是SATB本次GC还是会认为D是活的,不回收成为浮动垃圾,直到下次GC。

 

扩展:

  G1为何使用SATB算法?

    1、G1的每个region中都有一个RSet,这个RSet存储的都是引用本region对象的引用,所有获得SATB只需要读region的RSet就可以获得。

    2、remark阶段SATB算法更快,原因是:remark阶段SATB算法只处理那些被删除的引用,即并行标记开始引用,后面不引用了。(CMS的remark阶段除了删除的,还处理了新增引用,emark阶段扫描dirty card 和gc root(已经扫过的不扫),所以浮动垃圾stab是更多的)

  

标签:G1,标记,对象,三色,SATB,引用,CMS
来源: https://www.cnblogs.com/sfzlstudy/p/15518874.html

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

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

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

ICode9版权所有