1.什么时候触发新生代与老年代的混合垃圾回收?
“-XX:InitiatingHeapOccupancyPercent”参数,默认为45%。当老年代的Region占了45%时,会触发新生代+老年代混合回收阶段。
2.回收过程
①初始标记——“Stop the World”
标记GC Roots(栈的局部变量、方法区的类静态变量)直接引用的对象。
②并发标记
进行追踪,从GC Roots开始追踪所有存活对象。并发标记阶段与系统程序并发运行,所以对程序影响不大。这个阶段还会记录对象的新建与失去引用。
③最终标记——“Stop the World”
最终标记阶段会根据并发标记的记录,最终标记哪些对象存活,哪些是垃圾。
④混合回收——“Stop the World”
这个阶段会根据我们预设的GC停顿时间,可能回收的Region有新生代+老年代+大对象一起回收,达到可控时间内回收最多垃圾的目的。
混合回收是基于复制算法,把存活对象移到另一个Region去,再消除这个Region对的垃圾对象。
“-XX:G1MixedGCLiveThresholdPercent参数,默认是85%,表示要回收的Region的存活对象要低于85%才回收。
3.G1垃圾回收器的一些参数
① -XX:G1MixedGCCountTarget”
在混合回收的过程中,会停止所有程序运行,所以G1允许执行多次混合回收。
-XX:G1MixedGCCountTarget”参数,代表执行几次混合回收,默认值为8次。
意思是先停止系统运行,混合回收一些Region,再恢复系统运行,再停止系统运行,混合回收一些Region;往返重复8次。
② “-XX:G1HeapWastePercent”
混合回收时基于复制算法,在回收的过程中会不断空出新的Region来,一旦空闲出来的Region达到了堆内存的5%,就会停止混合回收。
4.回收失败的处理
如果在Mixed回收中,当没有空间的Region进行复制算法时,就会触发失败,立马停止系统程序,然后采用单线程进行标记、清理、整理,这个过程是极慢的。