19_G1 参数说明
约 648 字大约 2 分钟
2024-08-10
什么时候触发新生代 + 老年代的混合垃圾回收
G1 有一个参数是 -XX:InitiatingHeapOccupancyPercent,默认值是 45%
意思是如果老年代占据了堆内存 45% 的 Region 时,就会尝试触发一个新生代 + 老年代一起回收的混合回收
G1 垃圾回收过程
1、初始标记
- 标记
GC Roots直接引用的对象,速度很快,会进入Stop the World状态
- 标记
2、并发标记
- 从
GC Roots开始追踪所有存活对象,与系统同时运行,影响不太大
- 从
3、最终标记
- 根据并发标记阶段的记录,最终标记一下那些是存活对象,那些是垃圾对对象,会进入
Stop the world
- 根据并发标记阶段的记录,最终标记一下那些是存活对象,那些是垃圾对对象,会进入
4、混合回收
计算每个
Region中存活对象数量,存活对象占比,执行垃圾回收的预期和效率系统停止运行,选择部分
Region进行回收,将垃圾回收导致的停顿时间控制在指定时间范围内
需要注意的是,老年代对堆内存占比达到 45% 的时候,触发的是混合回收
根据设定的 GC 停顿时间目标,G1 从新生代、老年代、大对象里挑选一些 Region,保证在指定时间内回收尽可能多的垃圾
G1 垃圾回收器的一些参数
-XX:G1MixedGCCountTarget,默认值是8- 在垃圾回收过程中的混合回收阶段,执行几次混合回收。反复多次执行不仅可以回收
Region,还可以把系统停顿时间控制在指定范围内
- 在垃圾回收过程中的混合回收阶段,执行几次混合回收。反复多次执行不仅可以回收
-XX:G1HeapWastePercent,默认值5%- 对
Region的回收都是基于复制算法进行的,回收后空闲的Region数量达到了堆内存的5%,就会停止混合回收,也就意味着本次混合回收结束了
- 对
-XX:G1MixedGCLiveThresholdPercent,默认值85%- 存活对象低于
85%的Region才可以回收,要是一个Region的存活对象多于85%,那拷贝到别的Region,成本是比较高的
- 存活对象低于
回收失败时的 Full GC
在进行 Mixed 回收时,年轻代和老年代都是基于复制算法进行回收的,把 Region 的存活对象拷贝到别的 Region 里去
万一在拷贝过程中发现没有空闲 Region 可以存放存活对象,就会触发一次失败
如果失败,就会停止系统程序,采用单线程进行标记、清理和压缩整理,空闲出来一批 Region,这个过程是很慢的