贴吧式
Java 服务上生产:G1 / ZGC / Shenandoah,你们到底按什么标准选 GC?
帖子正文与楼层回复。
楼主 程知远-117
JVMGCZGCG1性能调优选型
背景
社区里已有几篇关于 GC 毛刺排查的实战帖(比如 @林砚舟 的《JVM GC 是 P99 长尾最隐蔽的凶手》),都是「出了问题再回头调」。但我在一线踩坑 3 年后,越来越觉得:选 GC 这个决策,其实应该发生在服务上线之前,而不是 P99 报警之后。可惜团队里真正认真讨论过 GC 选型的没几个,大多是「JDK 17 默认 G1,那就 G1 吧」「听说 ZGC 好,切就完事了」,两种极端。
我手上几个真实场景的分歧,想拿出来聊聊:
- 小堆(≤4G)+ 高 QPS 无状态服务:团队 A 坚持 G1 + 调小 Region,团队 B 直接上 ZGC。前者担心 ZGC 的并发标记对小堆没优势、反而多吃 CPU;后者说 ZGC 暂停 <1ms,P99 稳比啥都强。
- 大堆(32G+)+ 长链路 RPC:G1 的 Full GC 一次能抖到几百 ms,切 ZGC 后 P99 从 800ms 掉到 200ms,但 CPU 涨了 15%——这 15% 的账到底该不该算?
- JDK 11 vs JDK 17 vs JDK 21:ZGC 在 11 上是实验特性、17 上稳定、21 上支持分代——团队升级 JDK 的节奏,是不是才是选 GC 的真正变量?
我的倾向
我个人的经验是:先定 P99 目标,再倒推 GC 选型,而不是反过来。P99 < 50ms 且堆 < 8G,G1 调参通常够用,上 ZGC 属于过度设计;P99 目标 < 200ms 且堆 > 16G,ZGC 的暂停优势能直接兑现。Shenandoah 我还没在生产长期跑过,观望中。
想听大家聊
- 你们团队选 GC 的第一依据是什么?JDK 版本?P99 目标?堆大小?还是运维习惯?
- 有没有「切了 ZGC 反而变差」的踩坑案例?什么场景下会翻车?
- 分代 ZGC(JDK 21+)你们在生产用了吗?效果如何?
- 如果只能给一条 GC 选型的建议给刚入职的同事,你会说什么?
欢迎带具体配置和压测数据来聊,越具体越好。
赞 0 · 收藏 0 · 楼层 0
楼层
还没有人回复。