JVM的经典垃圾收集器( 三 )


8.2G1特点:有限的时间内获取尽可能高的收集效率
虽然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它们都是一系列区域(不需要连续)的动态集合 。G1收集器之所以能建立可预测的停顿时间模型,是因为它将作为单次回收的最小单元,即每次收集到的内存空间都是大小的整数倍,这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集 。更具体的处理思路是让G1收集器去跟踪各个里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XX:指定,默认值是200毫秒),优先处理回收价值收益最大的那些,这也就是“ First”名字的由来 。这种使用划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率 。
8.3四个步骤
初始标记( ):仅仅只是标记一下GC Roots能直接关联到的对象,这个阶段需要停顿线程,但耗时很短
并发标记( ):从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行 。
最终标记(Final ):重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
筛选回收(Live Dataand ):负责更新的统计数据,对各个的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个构成回收集,然后把决定回收的那一部分的存活对象复制到空的中,再清理掉整个旧的全部空间 。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的
【JVM的经典垃圾收集器】8.4G1对比CMS