当混合回收无法跟上内存分配的速度,导致老年代也满了,就会进行Full GC对整个堆进行回收。G1中的Full GC也而是单线程串行的,而且是全暂停,使用的是标记-整理算法,代价非常高。
G1在移动过程中虽然也是全暂停,不过G1在选择回收集合上是变化的,每次只选择部分的区域进行回收,通过计算每个区域的预测暂停时间来保证每次回收所占用的时间。简单的说就是将一次完整的GC拆分成多次短时间的GC从而降低暂停的时间,尽量保证每次的暂停时间在用户的配置范围(-XX:MaxGCPauseMilli)内。
G1为了控制暂停时间,年轻代最大区域数是动态调整的,不过如果手动设置了年轻代大小,比如Xmn/MaxNewSize/NewRatio等,并且年轻代最大和最小值一样,那么相当于禁用了这个最大区域数调整的功能,可能会导致暂停时间控制的失效(因为年轻代GC是选择全部区域的,区域过多会导致暂停时间的增加)。所以G1中尽量不要设置年轻代的大小,让G1自动的进行调整