标准答案
- G1 按 Region 管理堆,通过混合回收优先处理收益较高的区域,并设定停顿目标。
- ZGC 等收集器尽量把标记和重定位并发化,适合对长停顿敏感的服务。
- 任何收集器都可能因分配速率、内存不足、并发线程或系统负载出现异常停顿。
- 应使用目标 JDK 的官方行为、GC 日志和真实压测选择,不能只按名称选型。
题目解析
G1、ZGC 等收集器通过分区、并发标记、着色指针或并发重定位降低长暂停,但会消耗 CPU、内存和写屏障成本。选择要看堆规模、分配速率、启动时间、吞吐和延迟目标。
低停顿收集器仍需要足够的堆余量和合理的分配速率。若存活对象过多、分配速度超过回收能力或 native 资源不足,换收集器不会消除 OOM。
暂停目标是调度目标或软目标,不是每次请求的硬保证。应在目标 JDK 和真实负载下比较 GC 日志、P99、吞吐、CPU 和内存,而不是只看参数名。
常见误区
- 误区:认为换成 ZGC 就不会 OOM。改正:仍要控制存活集、分配速率、堆上限和 native 资源。
- 误区:把 MaxGCPauseMillis 当作硬保证。改正:它是收集器的目标,实际暂停还受分配、堆和系统负载影响。
- 误区:忽略 JDK 版本和收集器支持边界。改正:以目标 JDK 官方行为和实际压测结果作为选型依据。