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
,这个过程是很慢的