parallel gc 行为由内存阈值直接决定:eden 不足触发 minor gc,对象超 eden 一半则直入老年代;老年代空间不足致晋升失败时触发 full gc;targetsurvivorratio 动态调控晋升年龄以控制 survivor 占用率。

Parallel GC 与内存阈值设置高度关联——不是间接影响,而是直接决定其行为模式和触发时机。这些阈值不单是“水位线”,更是 GC 决策引擎的输入参数,控制着对象分配路径、晋升条件、回收节奏乃至是否升级为 Full GC。
Eden 区阈值直接影响 Minor GC 触发与大对象直入老年代
当新对象尝试分配时,JVM 首先检查 Eden 区剩余空间:
- 若 Eden 空间不足,且该对象大小超过 Eden 区容量的一半(非固定值,由当前 Eden 实际大小动态计算),则跳过年轻代复制流程,直接分配到老年代——这叫“大对象直接分配”(Direct Allocation);
- 若 Eden 不足但对象不大,则触发 Young GC(Minor GC),回收后仍无法容纳,也会尝试晋升;
-
注意:这个“一半”阈值不可配置,是 Parallel GC 的硬编码策略,与
-XX:SurvivorRatio或-XX:TargetSurvivorRatio无关,但受-XX:NewSize/-XX:MaxNewSize影响——因为 Eden 大小由新生代总大小和 Survivor 比例共同决定。
老年代占用率阈值决定是否触发 Full GC
Parallel GC 本身不主动监控老年代使用率来触发收集,但它在每次 Young GC 后会评估晋升可行性:
- 若 Survivor 区中满足年龄阈值(
-XX:MaxTenuringThreshold)的对象准备晋升,而老年代剩余空间 不足以容纳这批对象,则直接触发 Full GC; - 这种判断依赖实时的老年代已用/可用空间,等效于一个隐式阈值:老年代使用率接近 100%(通常 >98%)即高危;
-
-XX:InitiatingHeapOccupancyPercent对 Parallel GC 无效(这是 G1/CMS 的参数),所以它没有显式的老年代触发阈值,全靠空间水位硬判断。
动态年龄阈值与 Survivor 占用率强绑定
Parallel GC 默认启用自适应策略(-XX:+UseAdaptiveSizePolicy),其中 -XX:TargetSurvivorRatio 是关键阈值参数:
- 它定义 Survivor 区“目标占用比例”,默认 50%,可设为 75 或 90;
- GC 过程中,JVM 根据实际存活对象大小和 Survivor 剩余空间,动态调整哪些年龄的对象可以晋升——目标是让 Survivor 利用率尽量贴近该比率;
- 例如设为 90%,系统会倾向于让更老的对象留在 Survivor,延迟晋升,从而降低老年代压力;但若 Survivor 实在装不下,仍会强制晋升并可能引发 Full GC。
堆整体水位影响 GC 频率与停顿权衡
虽然 Parallel GC 不基于百分比触发,但堆初始/最大尺寸(-Xms/-Xmx)设定了所有阈值的物理基础:
- 堆太小 → Eden 小 → Minor GC 频繁 → 晋升加速 → 老年代更快填满 → Full GC 上升;
- 堆太大 → 单次 GC 扫描范围大 → STW 时间拉长,尤其老年代 Mark-Compact 阶段;
-
-XX:MaxGCPauseMillis是软性目标,JVM 会反向调节新生代大小、晋升年龄等,本质是在不同阈值组合间做动态平衡。











