面试总结:掌握各类垃圾收集器的核心参数调优

浅晨酱_7014

浅晨酱_7014

2026-08-01

770人浏览

原创

jvm gc调优本质是在吞吐量、延迟、内存占用三者间依业务场景取舍:批处理优先吞吐量,选parallel gc并调-xx:gctimeratio;实时服务优先低延迟,选g1/zgc并设-xx:maxgcpausemillis;资源受限则重内存效率,合理控堆与新生代比例。

面试总结:掌握各类垃圾收集器的核心参数调优

面试中问到垃圾收集器(GC)参数调优,本质是考察你是否真正理解 JVM 内存模型、GC 工作机制,以及能否结合业务场景做合理取舍。不是背参数,而是讲清楚“为什么这么设”。

明确目标:吞吐量、延迟、内存占用,三者不可兼得

调优前必须先定义优先级:

  • 批处理任务(如报表导出)——优先吞吐量,选 Parallel GC,调大 -XX:MaxGCPauseMillis(实际不生效,但可作为 Parallel 的目标参考),重点调 -XX:GCTimeRatio(默认99,即允许1%时间用于GC)
  • 实时接口服务(如支付下单)——优先低延迟,选 G1 或 ZGC,关键参数是 -XX:MaxGCPauseMillis(G1 中建议设 20~200ms,ZGC 中设 10ms 也基本能达成)
  • 资源受限环境(如容器小内存)——优先内存效率,避免 Full GC,用 -XX:+UseSerialGC 或 G1 配合 -XX:G1HeapRegionSize 控制分区粒度

G1 调优的三个落地抓手

G1 最常被问,但很多人只记 -XX:+UseG1GC,忽略实际调节逻辑:

Porkbun
Porkbun

一款AI工具,主要用于通过 API v3 管理 Porkbun DNS 记录和域名。用于在 Porkbun 上创建、读取、更新或删除 DNS 记录;列出域名;配置 API 访问;处理常见记录类型(A、AAAA、CNAME、MX、TXT 等)。该技能包含 CLI 工具 `scripts/porkbun-dns.js`,用于可靠执行 DNS 操作,适合需要提升相关任务效率的用户。

下载
  • 初始堆与预期停顿绑定:G1 停顿时间受堆大小和存活对象影响,-Xms 和 -Xmx 设为相同值(避免扩容触发 Mixed GC),且总堆不宜超过 64GB(否则 Region 数过多,卡顿风险上升)
  • 混合回收节奏可控:通过 -XX:G1MixedGCCountTarget=8(默认8)控制每次 Mixed GC 回收多少老年代 Region;配合 -XX:G1OldCSetRegionThresholdPercent=20(默认10)限制单次加入老年代回收集的 Region 比例
  • 避免并发模式失败(CMF):出现 CMF 说明并发标记跟不上分配速度,需提前触发标记 —— 调小 -XX:G1ConcRefinementThreads(增加脏卡扫描线程),或增大 -XX:G1ReservePercent(默认10%,预留空间防晋升失败)

ZGC / Shenandoah 的关键配置不是“开箱即用”

它们主打低延迟,但需注意运行前提和边界:

  • ZGC 要求 JDK 11+(生产推荐 JDK 17+),启用必须配 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC;堆大小建议 ≥ 8GB(小于 4GB 反而不如 G1);-XX:ZCollectionInterval 可强制周期性 GC,但一般不建议设,依赖自动触发
  • Shenandoah 在 JDK 12+ 默认可用,需 -XX:+UseShenandoahGC;它对 CPU 更敏感,务必配 -XX:ShenandoahUncommitDelay=1000(毫秒)防止频繁内存归还影响性能
  • 两者都不支持 CMS 的 -XX:CMSInitiatingOccupancyFraction,也不用调新生代比例(ZGC/Shenandoah 是全堆并发回收)

验证比设置更重要:用真实指标说话

调参后必须观测,不能只看 GC 日志是否“没报错”:

  • 用 -Xlog:gc*:file=gc.log:time,tags,level(JDK 11+)代替旧版 -XX:+PrintGCDetails,日志更结构化
  • 关注三项硬指标:GC 吞吐率 = (应用运行时间 / 总时间) × 100%、平均 GC 停顿(STW 时间)、晋升失败/Full GC 次数
  • 压测时对比不同参数组合下 P99 响应时间波动 —— 如果 -XX:MaxGCPauseMillis 设为 50ms,但 P99 波动从 ±10ms 变成 ±80ms,说明该参数反而引发更多短频 GC,需回调

相关专题

更多
LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

180

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

80

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习