G1垃圾收集器简介
Garbage First(简称:G1)收集器是垃圾收集器技术倒退历史上的一个里程碑,它创始了收集器面向部分收集的设计思路和基于Region的内存布局模式.G1是一款次要面向服务端利用的垃圾收集器,HotSpot开发团队赋予它的冀望是将来能够替换掉JDK5中公布的CMS收集器. JDK9公布之日,G1发表取代了
Parallel Scavenge
加Parallel Old
的组合,成为服务端模式下默认的垃圾收集器,而CMS则被申明为(Deprecate)应用的收集器.G1实现了可控进展工夫的垃圾收集器,通过
-XX:MaxGCPauseMillis
参数进行设置,默认是200ms。
Region简介
G1创始了基于Region的堆内存布局,尽管G1也遵循分代思维,然而堆内存布局和其它垃圾收集的内存布局有着微小的变动. G1垃圾收集器不再保持固定大小分代分区,而是把间断的堆内存分成大小一样的独立区域(Region),每一个Region能够依据须要表演新生代(Eden)
,Survivor空间
,老年代
。 G1垃圾收集器能够依据表演不同角色的Region采纳不同的策略去解决,这样无论是新创建的对象,还是曾经存活了一段时间的对象, 或则经验过很屡次垃圾收集然而还存活下来的对象,都会有很好的成果。
G1中五种不同的Region
- 新生代(Eden Region)
- 年老代(Survivor Region)
- 老年代(Old Region)
- 巨型对象(Humongous Region)
- 未调配(Free Region)
巨型对象区(Humongous Region)
Region中有一种非凡的Humongous Region
,专门用来存储大对象。G1收集器规定只有对象的大小超过了Region
大小的个别就会被认为是巨型对象 。每个Region的大小能够通过-XX:G1HeapRegionSize
来调整(1MB-32MB,且为2的N次幂)。G1收集器通常把Humongous Region
看做老年代的一部分。
对象划分的规定
- 对象大小小于一半
Region
,间接存储到标记为Eden的Region - 对象大小大于一半
Region
然而小于一个Region
,存储到标记为Humongous的Region中 - 对象大小超过一个
Region大小
,存储到标记为Humongous的多个间断Region中
GC类型
- youngGC:回收Eden区和Survivor区
- MixedGC:回收所有的新生代和局部老年区
- FullGC:回收整个堆
Remenbered Set,简称RSet
因为分代的内存不间断,导致GC搜寻垃圾对象时,须要扫描整个堆。为了解决这个问题,G1为每个Region都保护了一个Remenbered Set
,用来记录对象的援用状况,当GC产生的时候依据Remenbered Set
的索引状况去搜寻。
Remenbered Set存储的援用关系类型
- 1.分区内援用
- 2.新生代分区Y1援用新生代分区Y2
- 3.新生代分区Y1援用老年代分区O1
- 4.老年代分区O1援用新生代分区Y1
- 5.老年代分区O1援用老年代分区O2
youngGC
时,GC Root次要是两类,栈空间和老年代到新生代辨别的援用(2,3)关系。MixedGC
时,因为只收集老年代区,所以老年代分区援用(4,5)关系将被应用。
G1垃圾收集器执行步骤
初始标记
标记GC Roots可能间接关联的对象(Root Region),批改TAMS
指针的值,使的下一阶段用户线程并发运行时,能在正确的Region中调配对象。须要进展用户线程,但耗时很短,且借助
Minor GC
时同步实现。
- TAMS:Top at Mark Start,Region 中的指针,用于并发标记时为对象分配内存空间。
根分区扫描
拿到初始标记的Root Region
,扫描整个堆的所有Region
的Rset
看是否有Root Region
,并标记Region
并发标记
遍历上一步标记过的Region对堆中对象进行可达性剖析,递归扫描整个堆里的对象图,找到要回收的对象。耗时较长,能够和用户线程并行。耗时较长,可遇用户线程并行,当对象扫描实现当前,还要重新处理SATB记录下的在并发时有援用变动的对象。
从新标记
短暂的暂停用户线程,用于解决并发标记
阶段遗留下来最初大量的SATB记录。
筛选回收
负责更新Region的统计数据,对各个Region的回收价值进行排序,依据用户所期待的进展工夫,来制订回收打算,能够自由选择任意组合的Region
进行回收,而后将须要回收的Region中的对象复制到空的Region
,再清理掉整个旧的Region
.这里波及挪动存活对象,所以也要暂停用户线程,由多条收集器线程并行实现。
G1提高效率的有哪些点
- 应用Rset升高了扫描范畴
- 从新标记阶段应用SATB速度比CMS的增量更快
- 清理过程中,抉择局部回收价值高的
Region
进行清理(MixedGC),而不是所有的Region
进步了清理效率。