最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
JVM 垃圾回收器选型与配置指南
时间:2026-07-28 07:03:59 编辑:袖梨 来源:一聚教程网
选垃圾回收器需先锚定业务目标:延迟敏感用ZGC/G1,吞吐优先选Parallel,大堆稳定用G1/ZGC;再匹配JDK版本默认策略;最后调三个核心参数并用JFR验证。
选垃圾回收器不是挑参数,而是匹配业务特征。停顿敏感就盯低延迟,吞吐压测就看吞吐量,堆大且稳定就考虑分代+并发,小内存服务干脆用默认也够用。
先看目标:延迟、吞吐还是容量
三类指标互斥性强,得先锚定主目标:
- Web API、实时风控、订单支付等对响应时间敏感的服务,优先选ZGC或G1,目标是单次GC停顿控制在10ms内
- 批处理、报表导出、离线计算类任务,更看重整体运行效率,Parallel Scavenge + Parallel Old组合能压到最低GC开销
- 堆内存超8GB且长期稳定(比如MES历史数据服务),G1的Region管理比传统分代更可控;超16GB建议直接上ZGC,尤其JDK 21后分代ZGC已成熟
再看版本与默认行为
JDK版本直接影响可用选项和默认策略:
- JDK 8:默认Parallel GC,CMS已废弃,G1需手动启用(-XX:+UseG1GC),适合4–32GB堆
- JDK 9–16:G1为默认,但未开启并发类卸载(-XX:+ClassUnloadingWithConcurrentMark)时元空间易泄漏
- JDK 17+:ZGC默认支持大堆,JDK 21起分代ZGC(-XX:+ZGenerational)正式可用,老年代停顿进一步压缩
关键参数不贪多,抓三个核心
调参不是堆参数,而是控节奏:
- -Xms = -Xmx:避免运行中堆扩容抖动,尤其容器环境必须设死
- -XX:MaxGCPauseMillis=200:G1/ZGC的目标值,不是硬上限,设太小(如50)反而触发频繁Mixed GC
- -XX:MaxMetaspaceSize=512m:防止动态类加载(如Spring Boot DevTools、热更新)撑爆元空间
验证比配置更重要
没监控的调优等于盲调:
- 加-XX:+PrintGCDetails -Xlog:gc*:stdout:time,uptime,pid,tags:JDK 9+统一日志格式,比旧版-XX:+PrintGCTimeStamps更结构化
- 关注Mixed GC频率(G1)、ZGC Pause时间分布(ZGC)、Full GC是否归零——只要出现Full GC,说明对象晋升异常或元空间/直接内存溢出
- 用JFR(Java Flight Recorder)录30分钟真实流量,导出GC事件看停顿毛刺,比压测更贴近生产