G1垃圾回收器
堆内存分为了多个大小相等的region,最多2048个
新生代和老年代只是逻辑上的概念
可以设置预期的圾回收时间
region是动态划分,按需分配。region归属是动态变化的,同一个可能是老年代、新生代、大对象区
G1参数
-XX:+UseG1GC 指定G1回收
-XX:SurvivorRadio 默认8 eden在新生代中的占比
-XX:G1HeapRegionSize 指定region个数
-XX:G1NewSizePercent 指定新生代占比
-XX:G1MaxNewSizePercent 指定新生代最大占多少 默认不超过60%
-XX:MaxGCPauseMills 系统最多停顿多久
-XX:InitiatingHeapOccupancyPercent 老年代占用多少比例,开启mixed混合回收 默认45%
-XX:G1MixedGCCountTarget 混合回收时,最后一阶段执行多少次混合回收 默认8次
-XX:MaxTurningTh reshold 连续躲过多次youngGC进入老年代 默认15
-XX:PretenureSizeThreshold=1M 大对象大小,超过直接去放大对象的region
-XX:G1MixedGCLiveThresholdPercent:85 region存活对象低于85%的才去回收
-XX:G1HeapWastePercent:5 最后一阶段混合回收,一旦空闲出的region超过堆内存5%,就停止本次混合回收
新生代回收
新生代region占到堆内存60% 或者 回收会达到指定GC停顿时间后。
此阶段会停止系统运行
mixed 的4个回收阶段
1、初始化标记:标记GC Roots直接引用的对象,速度快,需要停止系统运行
2、并发标记:从GC Roots追踪所有的存活对象,系统允许运行,速度慢。此阶段会对对象的修改(新建或者失去引用等等)记录起来
3、最终标记:停止系统运行,根据并发阶段记录的对象修改记录,最终标记下哪些对象是存活的,哪些对象是垃圾数据
4、混合回收阶段: 本阶段计算老年代的region中存活对象的占比和数量,执行回收的效率和预期性能,然后停止系统运行,全力回收,选择部分region进行回收,因为需要让垃圾回收停顿时间控制在我们指定的范围内
8次回合回收,收收停停,减少系统停顿时间
进行mixed回收过程中,万一出现拷贝过程中没有空闲的region,会触发失败,随后立马停止系统程序,切换为单线程标记,清理,压缩和整理,此过程极慢极慢