生产环境选垃圾回收器核心是匹配业务真实需求:响应敏感型服务(如电商订单、支付)优先g1或cms以控停顿;吞吐优先场景(如报表生成)用parallel gc;大堆低延迟(如64gb+工厂mes)选zgc或shenandoah;基础配置如-xms/-xmx相等、-xmn合理设置同样关键。

生产环境选垃圾回收器,核心是看业务对延迟、吞吐、堆大小和稳定性的真实要求,不是照搬文档或默认配置。
响应敏感型服务优先考虑低停顿回收器
比如电商订单、支付、实时风控这类接口P99必须控制在100ms内,CMS(JDK 8)或G1(JDK 8+)更合适。CMS在老年代并发标记阶段基本不STW,但要注意它无法处理浮动垃圾,一旦老年代占用超阈值(如-XX:CMSInitiatingOccupancyFraction=70),会触发Full GC——这反而造成秒级卡顿。G1通过Region划分和预测模型把停顿时间“可控化”,用-XX:MaxGCPauseMillis=150可设目标,但实际停顿受对象存活率、并发线程数影响,不能盲目压低该值。
吞吐优先或后台任务适合Parallel组合
报表生成、日志归档、批量导出等非交互式服务,更看重单位时间完成的任务量。此时-XX:+UseParallelGC -XX:+UseParallelOldGC组合更稳:年轻代用多线程复制,老年代用多线程标记整理,整体吞吐高,但单次GC停顿明显。参数上可适当加大-Xmn比例(如堆的40%),减少晋升频率;-XX:MaxTenuringThreshold调高至15,避免短生命周期对象过早进老年代。
大堆(32GB+)且延迟严苛时评估ZGC或Shenandoah
工厂MES中设备采集服务常面临堆内存64GB+、要求GC停顿-XX:+UseZGC,无需调优年轻代/老年代比例——它天然不分代(或可启用分代模式-XX:+ZGenerational)。注意ZGC要求Linux内核支持membarrier系统调用,容器部署需确认OS版本;Shenandoah则内存开销更低(约10%),适合资源受限的边缘节点。
别忽略基础配置对GC效果的放大作用
再好的回收器也架不住堆设置失当:
-
-Xms和-Xmx必须相等,避免运行时扩容抖动 -
-Xmn不宜固定死,建议设为堆的1/4~1/3,配合-XX:SurvivorRatio=8保持Eden:S0:S1=8:1:1 - 大对象(如图片缓存、长文本)用
-XX:PretenureSizeThreshold=1M直接进老年代,避免在Survivor区反复复制 - 开启
-XX:+AlwaysPreTouch让JVM启动时就锁定物理内存,减少运行时缺页中断
基本上就这些。











