当前位置: 首页 > 工具软件 > Log1 CMS > 使用案例 >

CMS与G1的最终标记

盖雪峰
2023-12-01

问题1:CMS和G1的重新标记,最终标记的目的是什么?
工作流程上来看,CMS的重新标记,和G1的最终标记之前,都是并发标记!并发标记就是,标记程序和用户程序同时执行!既然是同时运行,用户程序就可能修改对象的引用关系!修改对象引用关系就可能影响GC回收!所以,CMS重新标记,G1最终标记都是为了解决一件事,那就是 并发标记过程中用户程序修改了对象引用关系后,如何让GC收集器仍旧能正确回收垃圾对象的问题!整理一下:原因:并发过程中用户程序修改了对象引用关系!就是你说的改动!目标:即便对象引用关系修改,也能让GC收集器正确回收垃圾对象!如何解决?这又引出第2个问题,CMS和G1如何解决并发标记过程中 对象引用被更改的问题?
问题2:CMS和G1是如何解决并发标记过程中 对象引用被更改的问题?无论CMS和G1,并发标记阶段的结果都是 获得 一个可到达的对象关系;然后GC程序按照这个关系进行GC! 但是,有可能并发标记的同时,用户程序也修改了对象-引用关系这就出现一个信息合并的问题:
1)并发标记产生的可到达对象关系Rcon; R是Relationship关系;
2)用户程序修改的对象引用关系,Ruser;如果把Ruser和Rcon 合并一下,形成一个新的,完整的可到达对象关系Rfinal,交给GC程序,是不是就完美解决问题了!那如何处理这个信息合并的问题呢?CMS和G1都采取一种方式Write barrier+log,3个步骤:
1)Write barrier监听用户修改对象引用关系
2)监听同时写日志用户程序修改引用关系时候,监听并记录Ruser关系到日志Rslog(关键词是Remember Set log)
3)然后合并后期处理Rslog的过程中,把Ruser这部分信息与Rcon合并成Rfinal,然后用Rfinal 进行GC这里的后期处理,就是CMS的remark阶段和G1的final mark阶段。看到这,还是不能解决我的疑问啊,那些什么 运行一段时间死掉的对象,和漏掉的对象怎么处理?这就引出第3个问题,CMS和G1的Rslog中记录的是什么?记录了什么才知道处理了什么!
问题3:CMS和G1的Rslog中记录的是什么?Rslog的作用就是记录用户程序对对象关系的修改;用户程序的修改只能有2种:
1)增加了引用-对象关系;Object o=new Object();或者 o1=new Object();
2)删除了引用-对象关系; o=null;而这两种刚好是CMS和G1实现的方式,对于CMSRslog记录的新增关系;删除关系会被忽略,变成浮动垃圾,下一次GC回收;writer barrier是insert barrier,会监听新增的引用关系,并记录日志所以CMS会处理新增关系,忽略删除关系对于G1Rslog记录的删除关系;新增关系会被忽略,变成浮动垃圾,以后GC处理;writer barrier是delete barrier,会监听引用关系删除,并记录日志所以G1会处理删除关系,忽略新增关系。
1这里的产生变动是指什么意思?==变动就是修改了对象与引用的关系
2是指原来某些对象标记为可达的,但程序继续运行一定时间后,已经死掉了,重新标记是为了重新标记这些对象?==对象原来可到达,然后对象死掉这个逻辑 只能发生在并发标记阶段;STW暂停过程对象关系是不变的;这些对象原来可到达,说明这些对象与引用的关系已经在Rcon中了,死掉,又被记录到Rslog中了,被重新标记阶段处理了。所以重新标记阶段 确实重新标记了你说的对象;但是又回来,说重新标记是为了标记这些对象,把重新标记的作用局限了;重新标记是为了获得即时的,正确的可到达对象关系。
3又找了一下资料,有一种说法是说:标记并发过程中错过的对象。那是在什么情况下错过的?是指并发标记的时候,又有新的对象进入了老年代并连接到了已经枚举过的GC Root上面了?
----并发标记过程中会错过对象吗?==看你怎么理解,如果是最终一致性解释,没有会被错过的对象,都记录到Rslog中后期处理后更新到Rfinal中了;如果按照强一致性解释,会错过,错过的都记录到Rslog中了。----是指并发标记的时候,又有新的对象进入了老年代并连接到了已经枚举过的GC Root上面了?==并发标记过程中,是否会有 新对象进入了老年代?不会,并发标记过程中不会整理内存,所以对象内存地址不会被改变。所以我猜你是想问:并发标记阶段,新建对象与GC Root对象建立了连接怎么处理?建立连接有2种:
1)新对象引用GC Root中对象;这种情况下,无论CMS还是G1都会等到以后的GC处理。
2)GC Root中对象引用新对象;这种情况属于新增对象-引用关系,在CMS中,会被记录到Rslog中,然后remark阶段处理,合并到Rfinal中,不会被垃圾回收在G1中,不会被记录到Rslog中,不会被final mark,不会合并到Rfinal中,会被忽略,也不会被垃圾回收为啥G1也不会被垃圾回收啊?G1说,我是以region为目标回收的,新增关系的情况,我记录到其他region A就可以了;至于A region啥时候被回收,要看具体情况了!

 类似资料: