选垃圾收集器需根据业务在吞吐量、停顿时间、内存水位三维度的主诉求:吞吐优先用parallel gc或调优g1;停顿敏感用g1(≤16g)、zgc(超20g/≤10ms);内存水位高则重点调优g1防晋升与碎片。

选垃圾收集器不是比谁“新”,而是看业务在吞吐量、停顿时间、内存水位这三个维度上到底怕什么。
批处理任务跑一小时,能接受几次秒级卡顿,但不能容忍整体慢——那就盯吞吐量;
用户下单接口响应必须快,哪怕多花点CPU、多占点内存——那就死守停顿时间;
风控模型常驻内存、对象大且生命周期长,老年代悄悄涨到90%就危险——那内存水位就是红线。
看吞吐量优先的场景:用G1或Parallel GC
- 批量报表、日志归档、ETL清洗这类后台作业,目标是单位时间完成更多任务。
- Parallel GC(-XX:+UseParallelGC)天然适合:它用多线程压缩式回收,吞吐量高,但停顿不可控,可能达几百毫秒。
- G1也能调成吞吐优先模式:设 -XX:MaxGCPauseMillis=500(放宽目标),配合 -XX:G1HeapRegionSize=2M 和足够大的堆(比如32G),让它少做Mixed GC、多靠Young GC清理,吞吐可稳定在97%+。
看停顿时间敏感的场景:用G1、ZGC或Shenandoah
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- API网关、支付回调、实时消息推送,要求P99停顿 ≤ 200ms,抖动小。
- G1在堆≤16G时表现稳健:开启 -XX:+UseG1GC + -XX:MaxGCPauseMillis=200,再调 -XX:G1NewSizePercent=35 控制新生代下限,避免频繁Young GC拖累响应。
- 堆超20G、延迟要求压到10ms内?直接上ZGC(-XX:+UseZGC):它并发标记+并发移动,STW仅两次“染色指针”更新,实测8G堆下平均停顿
看内存水位持续爬升的场景:重点防晋升与碎片,G1仍是首选
- 大图渲染服务加载GB级缓存、实时模型反复加载权重,老年代缓慢上涨,一两天后触发Full GC。
- 先查GC日志里 “Promotion Failure” 和 “Humongous Allocation” 频次:若高,说明大对象直入老年代,或Survivor撑不住。
- 调 -XX:G1HeapRegionSize=4M(匹配大对象尺寸),加大 -XX:G1SurvivorRatio=8(Survivor区占比提升),并用 -XX:InitiatingHeapOccupancyPercent=45 提前启动Mixed GC,把老年代水位锁在60–75%安全区间。
别跳过验证环节
参数配完不算完,得用真实流量跑24小时:
- 用 jstat -gc -h10 PID 1s 看GC频率和各代变化趋势
- 用GCeasy解析日志,算出实际吞吐量 = (运行总时间 − GC总耗时) / 运行总时间
- 画老年代占用曲线,斜率超过0.5%/小时就得干预
收集器不是银弹,G1能覆盖80%企业场景,ZGC适合超低延迟新系统,Parallel GC别在交互服务里硬套——对齐业务的真实瓶颈,三维里守住主指标,其余靠参数微调找平衡。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










