选java垃圾回收器核心是匹配业务特征:响应时间敏感服务(如下单、支付、风控、api网关)优先选zgc或g1,目标单次gc停顿≤10ms;吞吐优先批处理任务选parallel;大堆稳定场景可选g1/zgc;小内存服务用默认即可。

选Java垃圾回收器,核心是看业务最不能容忍什么:是卡顿、吞吐掉链,还是内存吃紧。不是版本新就一定好,也不是参数多就更优。
响应时间敏感的在线服务
比如用户点击下单、支付接口、实时风控、API网关等,要求每次GC停顿尽量短(最好
- 首选ZGC(JDK11+)或Shenandoah(JDK12+):并发标记+并发移动,停顿基本稳定在10ms内,不随堆增大而显著增长;启用方式为-XX:+UseZGC或-XX:+UseShenandoahGC
- 次选G1(JDK9+默认):适合中大型堆(4–32GB),通过-XX:MaxGCPauseMillis=200设目标停顿,实际通常控制在几十毫秒;注意避免设过低(如50ms),否则会触发频繁Mixed GC
- CMS已废弃(JDK9起弃用,JDK14彻底移除),新项目绝不可用
吞吐量优先的后台任务
比如日终结算、ETL清洗、报表生成、离线模型训练等,允许单次停顿较长(几百毫秒甚至秒级),但要求单位时间完成更多工作。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐Parallel GC(JDK8默认,也称吞吐量收集器):并行回收新生代和老年代,最大化CPU利用率;启用参数为-XX:+UseParallelGC -XX:+UseParallelOldGC
- 可配合-XX:GCTimeRatio=99(即GC时间占比≤1%)或-XX:MaxGCPauseMillis(仅作软目标)调优
- 这类场景下ZGC/G1反而可能因并发开销拉低整体吞吐,得不偿失
内存受限或长期稳定运行的服务
比如容器化部署(512MB~2GB堆)、嵌入式Java应用、7×24网关/注册中心,既要防OOM,又要抗碎片、少Full GC。
- 小堆(-XX:+UseSerialGC即可
- 中大堆且需抗碎片:G1和ZGC都内置压缩机制,能主动整理内存;而Parallel Old和CMS不压缩老年代,长期运行易因碎片触发Full GC
- 容器环境必须加-XX:+UseContainerSupport(JDK10+默认开启),否则JVM读不到cgroup内存限制,GC策略会误判
验证比配置更重要
再匹配的理论选型,不经过真实负载验证就是纸上谈兵。
- 上线前务必开启GC日志:-Xlog:gc*:stdout:time,uptime,pid,tags(JDK9+统一格式)
- 重点观察:Mixed GC频率(G1)、ZGC Pause分布、是否出现Full GC——只要出现Full GC,大概率是对象晋升异常、元空间溢出或直接内存泄漏
- 用JFR(Java Flight Recorder)录制30分钟生产流量,比压测更能暴露真实GC毛刺和长尾停顿
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










