一、介绍:
1.停顿时间模型??
作为CMS收集器的替代者和继承人,G1是基于“停顿时间模型”诞生的的垃圾收集器,停顿时间模型的意思是能够支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标.
2.G1摒弃了以往对堆中区域分代的划分思想,而是将堆划分为大小相同的区(Region), 但是依旧传承着不同的角色,相同的区也依旧可以被看作伊甸园(Eden) 幸存区(Survivor) 老年代区域(Old),G1会针对扮演不同角色的区域都进行对应的策略进行处理. G1会有选择的选择垃圾最多的区域进行回收,这就是Mixed GC模式..
3.如何实现的"停顿时间模型"以及为何高效??
(1)G1收集器之所以能建立可预测的停顿时间模型,是因为它将Region作为单次回收的最小单元,
即每次收集到的内存空间都是Region大小的整数倍,这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集。
(2)更具体的处理思路是让G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小,
价值即回收所获得的空间大小以及回收所需时间的一个经验值,然后在后台维护一个优先级列表,
每次根据用户设定允许的收集停顿时间(使用参数-XX:MaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region,这也就是“Garbage First”名字的由来。
这种使用Region划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率。
二、G1高效的地方(总结两点)
- -- 基于分区(Region)的内存划分,避免了分代回收时对整个大区域的垃圾回收,分区回收只需要回收一个区的整数倍
- -- G1维护的每个区的回收价值的优先级列表,使得回收更有针对性优先回收价值高的,更加高效
基于上述,实现了G1回收时可控的将垃圾回收的时间控制在制定的毫秒内,从而满足了"停顿时间模型"...
三、只谈G1的工作流程: (STW-stop the world)
只是简单标记GC Root根对象.
- 并发标记(不会STW)
* 允许用户线程一起运行,可达性分析沿着GC Root标记的根对象对对象图进行一个全扫描!标记出垃圾..
* 通过写屏障的技术记录下会发生错标的对象
- 最终标记(STW)
* 解决发生的错标问题,通过原始快照的算法(SATB)解决.重新扫描一下被记录下来的灰色对象!
- 筛选回收(STW) [因为标记整理算法需要移动对象,所以一定要STW]
* 根据G1跟踪生成的对于不同区的优先级列表,对区进行有选择的进行回收,优先回收那些回收价值大的区!
根据用户设置的允许停顿的时间值(默认200ms 停顿时间模型)生成对应的回收计划,然后选择多个region生成一个回收集(CSet),将回收集先拷贝到空的区中,然后清除掉旧的回收集.
四、与CMS的比较
垃圾收集完成之后能提供规整的可用内存。这种特性有利于程序长时间运行,在程序为大对象分配内存时不容易
因无法找到连续内存空间而提前触发下一次收集。
(2) 内存占用方面
堆中每个Region,无论扮演的是新生代还是老年代角色,都必须有一份卡表,这导致G1的记忆集(和其他内存消耗)可能会占整个堆容量的20%乃至更多的内存空间;
相比起来CMS的卡表就相当简单,只有唯一一份,而且只需要处理老年代到新生代的引用,反过来则不需要,由于新生代的对象具有朝生夕灭的不稳定性,引用变化频繁,能省下这个区域的维护开销是很划算的。
注意:
- 对卡表的维护工作,都是通过写屏障的技术完成的!
- CMS中因为只需要维护一份卡表(老年代和新生代的引用问题),所以卡表的维护是同步的方式!
- G1中每一份region都需要持有一个Remembered Set(记忆集),所以卡表的维护较为繁琐,所以采取异步的方式!
譬如,将Java堆分成多个独立Region后,Region里面存在的跨Region引用对象如何解决?
解决的思 路我们已经知道(见3.3.1节和3.4.4节):使用记忆集避免全堆作为GC Roots扫描,但在G1收集器上记忆集的应用其实要复杂很多,它的每个Region都维护有自己的记忆集,这些记忆集会记录下别的Region 指向自己的指针,并标记这些指针分别在哪些卡页的范围之内。G1的记忆集在存储结构的本质上是一 种哈希表,Key是别的Region的起始地址,Value是一个集合,里面存储的元素是卡表的索引号。
这种“双向”的卡表结构(卡表是“我指向谁”,这种结构还记录了“谁指向我”)比原来的卡表实现起来更 复杂,同时由于Region数量比传统收集器的分代数量明显要多得多,因此G1收集器要比其他的传统垃圾收集器有着更高的内存占用负担。根据经验,G1至少要耗费大约相当于Java堆容量10%至20%的额外内存来维持收集器工作。