一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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事件看停顿毛刺,比压测更贴近生产

热门栏目