JVM之垃圾回收-垃圾收集器( 五 )


运作过程
不计算维护 Set的操作,可以分为4个步骤(与CMS较为相似) 。
1.初始标记( )
仅标记一下GC Roots能直接关联到的对象;
且修改TAMS(Next Top at Mark Start),让下一阶段并发运行时,用户程序能在正确可用的中创建新对象;
需要"Stop The World",但速度很快;
2.并发标记( )
从GC Roots开始进行可达性分析,找出存活对象,耗时长,可与用户线程并发执行
并不能保证可以标记出所有的存活对象;(在分析过程中会产生新的存活对象)
3.最终标记(Final )
修正并发标记阶段因用户线程继续运行而导致标记发生变化的那部分对象的标记记录 。
上一阶段对象的变化记录在线程的 Set Log;
这里把 Set Log合并到 Set中;
需要"Stop The World",且停顿时间比初始标记稍长,但远比并发标记短;
G1采用多线程并行执行来提升效率;且采用了比CMS更快的初始快照算法:-At-The- (SATB) 。
4.筛选回收(Live Dataand )
首先排序各个的回收价值和成本;
然后根据用户期望的GC停顿时间来制定回收计划;
最后按计划回收一些价值高的中垃圾对象;
回收时采用"复制"算法,从一个或多个复制存活对象到堆上的另一个空的,并且在此过程中压缩和释放内存;
可以并发进行,降低停顿时间,并增加吞吐量;
【JVM之垃圾回收-垃圾收集器】G1收集器运行示意图
总结
G1在标记过程中,每个区域的对象活性都被计算,在回收时候,就可以根据用户设置的停顿时间,选择活性较低的区域收集,这样既能保证垃圾回收,又能保证停顿时间,而且也不会降低太多的吞吐量 。(重新标记)阶段新算法的运用,以及收集过程中的压缩,都弥补了CMS不足 。
引用官网的一句话:“G1 isas the long termfor theMark-Sweep(CMS)” 。
G1计划作为并发标记-清除收集器(CMS)的长期替代品
没关注公众号的朋友,可以关注一波,干货多多