适用场景:
- 同时注意吞吐量和低延迟 默认的暂停目标是200ms ,
- 适合超大堆内存,会将堆划分为多个大小相等的区域
特点:
- 整体上是标记+整理算法,两个区域之间是复制算法
垃圾回收阶段:
- Young Collection新生代的垃圾收集
- Young Collection + Concurrent Mark(新生代垃圾回收+并发标记)
- Mixed Collection 混合收集
- Young Collection新生代的垃圾收集:
① 如下图1-1,G1垃圾回收器把堆内存划分为一个个大小相等的区域,每个单独的区域都可以作为伊甸园、幸存者区域或老年代,并会设置伊甸园区域的大小。
②当伊甸园区域逐渐被占满(白色区域代表空白,绿色代表对象存入伊甸园区),则进行Young Collection(新生代垃圾收集),并会触发时间较短的stop the world。 经过Young Collection,把伊甸园没有被回收掉的对象以拷贝的方式放入幸存区S。
③再经过一段时间,当幸存区对象比较多了,幸存区会再触发垃圾回收。幸存区有一部分对象,年龄达到阈值会晋升到老年代O,而对于年龄达不到阈值的幸存对象,继续拷贝到新的幸存者区域。
- Young Collection + Concurrent Mark(新生代垃圾回收+并发标记)
①在Young GC时会进行GC Root的初始标记(对根对象进行标记,在新生代GC时发生)
②在老年代占用堆空间比例达到阈值(默认45%)时,进行并发标记(不会stop the world)
注:阈值可以用JVM参数来设定:-XX:InitiatingHeapOccupancyPercent=percent
- Mixed Collcetion混合收集
这个阶段会对伊甸园、幸存者区域和老年代进行全面回收。
- 伊甸园的幸存对象,被复制到幸存者区;
- 幸存者区域存活且年龄不到的对象被复制到新的幸存者区域,年龄到达阈值的晋升到老年代;
- 老年代的对象,也采用了复制算法,把老年代存活的对象,复制到新的老年代区域。但不是所有的老年代幸存对象都直接复制到新的老年代区域。因为堆空间可能太大,老年代的对象回收会经过大量时间,所以G1回收器根据最大回收时间,挑选回收价值最大的老年代区域进行复制和垃圾回收。复制的时间少了,就达到了暂停时间短的目标。
注:
- 混合收集在最终标记和拷贝存活两个阶段都会触发stop the world
- 最终标记是为了,标记并发标记可能漏掉的对象(并发标记的同时,其他线程也在工作,可能会产生一些新的垃圾,改变一些对象的引用)。
- 拷贝存活是在最终标记之后,进行复制转移。