g1reservepercent 是 g1 垃圾收集器中用于预留老年代空间以避免并发标记失败的关键参数,默认值为 10%,它设定老年代必须保持空闲的最小百分比,作为并发标记能否持续的安全水位线。

G1ReservePercent 是 G1 垃圾收集器中一个关键的调优参数,用于预留一部分老年代空间,防止在并发标记(Concurrent Marking)阶段因晋升或分配压力导致老年代被填满,从而触发 Full GC。
为什么需要预留老年代空间?
G1 的并发标记过程不是完全 STW 的,它和应用线程并发执行。在此期间,应用仍会持续分配对象、发生年轻代 GC,并可能将存活对象晋升到老年代。如果老年代剩余空间不足,就无法容纳新晋升对象,G1 会提前终止并发周期,降级为 Full GC —— 这正是要避免的情况。
预留空间就是给这部分“不可预测但必然发生”的晋升留出缓冲带。
G1ReservePercent 的作用机制
该参数指定老年代总容量中,必须保持空闲的最小百分比(默认值为 10%,即 -XX:G1ReservePercent=10)。
- 当老年代已使用空间 ≥ (100% − G1ReservePercent)% 时,G1 会认为老年代“快满了”,提前启动混合回收(Mixed GC),甚至中止并发标记
- 它不控制实际内存分配,而是作为并发标记能否继续的“安全水位线”
- 预留空间不会被用于普通对象分配,仅作保护用途
如何合理设置 G1ReservePercent?
设置过低(如 5):缓冲不足,容易在高晋升率场景下触发退化;设置过高(如 20+):浪费可用堆空间,降低吞吐,也可能导致混合 GC 频繁启动。
- 观察日志中
Concurrent Cycle Aborted或to-space exhausted是否频繁出现 —— 这是预留不足的典型信号 - 结合
G1HeapRegionSize和实际晋升量评估:若每次年轻代 GC 晋升 50MB,而每个 Region 是 1MB,则至少需预留 50+ 个 Region 空间 - 生产环境建议从 10 开始,根据 GC 日志中
Free space in old gen和mixed GC target old gen size趋势微调
它和 InitiatingOccupancyPercent 的关系
G1InitiatingOccupancyPercent 控制并发标记启动阈值(默认 45%),而 G1ReservePercent 控制其能否顺利完成。两者协同:
- 前者决定“什么时候开始干”
- 后者决定“干到一半发现没退路了,只能停”
- 即使设置了较高的 InitiatingOccupancyPercent,若 ReservePercent 太小,仍可能在标记中途失败











