1. G1内部是一系列大小相同的Region内存区域,通过参数“-XX:UseG1GC”来指定使用G1垃圾回收器,默认最有有2048个Region,Region的大小可以通过-XX:G1HeapRegionSize
参数指定,大小区间只能是1M、2M、4M这种2的幂次方的大小。通过参数"-XX:G1NewSizePercent"设置新生代初始大小,默认为5%。通过参数“-XX:G1MaxNewSizePercent”设置新生代最大占比,最大值为60%。通过参数“-XX:MaxGCPauseMills”设定GC时,系统停顿时长,默认值为200ms,简单理解,当有一定数量的Region被占满之后,分析得知清理垃圾回收清理这些Region时需要大概200ms时,可能触发一次垃圾回收。
例如:“-Xms4096M -Xmx4096M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseG1GC”,这样每个Region大小为2M
G1通过复制算法来进行垃圾回收,回收期间需要STW。
上图中的每个Region也会分别被标记为Eden,Survivor,Old和humongous(巨型对象),ygc当Eden内存耗尽时进行,fgc当混合回收来不及时,导致内存占满则进行fgc。
2. G1混合垃圾回收流程
第一步进行初始标记,GC Roots直接能引用的对象(STW)
第二步进行并发标记,从GC Roots开始追踪所有存活对象
第三步最终标记阶段,根据并发标记阶段判断哪些是存活,哪些是垃圾对象(STW)
第四步混合回收(新生代和老年代一起回收)-XX:InitiatingHeapOccupancyPercent该参数的设定,指定当老年代内存达到一定占比进行混合回收,默认是45%
“-XX:G1MixedGCCountTarget”参数,在一次混合回收的过程中,最后一个阶段执行几次混合回收,默认值是8次,最后一个阶段,先停止系统运行,混合回收一些Region,再恢复系统运行,接着再次禁止系统运行,混合回收一些Region,反复8次。
“-XX:G1MixedGCLiveThresholdPercent”,存活对象低于该设定值时进行回收,默认是85%
“-XX:G1HeapWastePercent”空闲出来的Region达到该设定值时停止回收,即统计出所有可被回收的垃圾占Heap的比例值,默认值是5%,如果超过5%则进行后续多轮mix gc。
3. G1优化
给JVM的堆区域足够的内存,合理设置“-XX:MaxGCPauseMills”参数