快捷搜索: 王者荣耀 脱发

对于CMS产生浮动垃圾和G1的一些理解

CMS之所以产生浮动垃圾是因为在并发标记阶段,用户线程和回收线程一块工作,可能会产生之前存活的对象在这段时间消亡了,但是这个已经消亡的对象在初始标记时被标记成了黑色(三色标记法),那么后面就不会对其进行回收,只能等到下一次GC时被回收 这里说一下并发标记阶段会产生的两个问题、 1、漏标:漏标的意思就是存活的对象没有被标记,之所以会产生这种现象还是并发标记过程中用户现场和回收线程一块执行,可能会发生之前标记过的黑色对象突然和某个白色对象建立起了链接(可以认为是白色对象使用finalize方法复活了)此时因为黑色对象是不会再次被扫描的,而又没有其他对象指向白色对象,所以此时就发生了漏标现象,而CMS在重新标记阶段也是在处理漏标的对象(漏标造成的影响大,毕竟我们不能接受垃圾回收器回收一个存活的对象) 2、错标:错标指的是死掉的对象被标记了,此次垃圾回收不会回收他,这个就是在并发标记阶段之前被标记为黑色的对象在此阶段死掉了,但是重新标记阶段又没有处理(错标造成的影响显然比漏标小,只是将垃圾回收放到了下次,虽然造成了空间浪费,但是显然比回收存活对象好得多),所以就产生了浮动垃圾 为什么G1没有浮动垃圾呢?其实G1的最终标记阶段也是解决了漏标的问题,但是G1是不会产生浮动垃圾的,因为G1在并发标记阶段每当发生引用的变动时都会记录下来也就是STAB数据,当对象图扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。因为浮动垃圾的产生一定是伴随着引用断开,所以G1就是利用STAB的数据以及Remaberd Set来对对象的着色进行一个调整,依次来避免浮动垃圾,其实G1的最终标记也是对这一步的一个补充,毕竟所有对象扫描完之后并发标记就结束了,此时还有一部分的STAB没有处理,就需要最终标记来处理了

是一些自己的理解,希望大家指正

经验分享 程序员 微信小程序 职场和发展