JVM调优核心是精准配置内存、垃圾回收与诊断参数以匹配业务负载:堆内存需-Xms=-Xmx避免动态调整,-Xmn设为1/3~1/2堆大小;元空间必须设-XX:MaxMetaspaceSize防OOM;小堆用ParallelGC,中大堆选G1GC,超大堆或低延迟场景用ZGC;辅以GC日志与堆转储等诊断参数。

JVM 调优的核心就是合理配置参数,让内存分配、垃圾回收和运行时行为匹配实际业务负载。关键不在于堆砌所有参数,而在于抓住几类真正影响稳定性和性能的主干配置。
堆内存参数:最基础也最关键的配置
堆是对象存活的主要区域,参数设不合理会直接引发 OOM 或频繁 GC。 - -Xms 和 -Xmx 必须设为相同值(例如-Xms4g -Xmx4g),避免运行中动态扩容缩容带来的 STW 开销和性能抖动。
- -Xmn 控制新生代大小,建议设为堆总大小的 1/3 到 1/2;过大导致老年代压缩、Full GC 增多,过小则对象快速晋升、加剧老年代压力。
- -XX:SurvivorRatio=8 是默认值,表示 Eden : S0 : S1 = 8 : 1 : 1;若 Survivor 区常被填满、对象提前进入老年代,可适当调大该比值(如 12),给对象更多“存活观察期”。
- -XX:MaxTenuringThreshold 默认 15,多数短生命周期对象在 Minor GC 中就被回收,无需修改;仅当发现大量对象在年轻代反复拷贝后才晋升,可结合 GC 日志分析是否需调低。
元空间参数:避免类加载引发的 OOM
JDK 8+ 已废弃永久代,改用本地内存的元空间(Metaspace)。 - -XX:MetaspaceSize=128m 是触发首次元空间 GC 的阈值,设太低(如默认 21MB)会导致应用启动初期频繁卸载类;设太高则延迟 GC,可能撑爆本地内存。 - -XX:MaxMetaspaceSize=512m 必须显式设置上限,否则元空间无限制增长,最终耗尽系统内存;Spring Boot 等大量反射和动态代理的应用,建议从 256m 起步,根据实际类数量逐步上调。 - 不推荐依赖 -XX:MinMetaspaceFreeRatio 和 -XX:MaxMetaspaceFreeRatio 自动扩缩,它们在高动态类加载场景下响应滞后,不如固定上限 + 监控告警更可控。垃圾回收器选择:按堆大小与延迟要求匹配
GC 器不是越新越好,而是看业务特征是否契合。 - 小堆(≤ 4GB)、吞吐优先:用 -XX:+UseParallelGC,适合批处理、后台任务。 - 中大堆(4–32GB)、兼顾吞吐与停顿:-XX:+UseG1GC 是当前主流选择,配合 -XX:MaxGCPauseMillis=200 可设定预期停顿目标(注意:这是软目标,非硬保证)。 - 超大堆(≥ 64GB)或对延迟极度敏感(如金融交易):考虑 -XX:+UseZGC(JDK 11+)或 -XX:+UseShenandoahGC(JDK 12+),两者都支持并发标记与清理,典型停顿控制在 10ms 内。 - CMS 已在 JDK 9 中被标记废弃、JDK 14 彻底移除,新项目严禁使用。辅助但实用的诊断参数
上线前建议加上,便于出问题时快速定位。 - -Xlog:gc*:gc.log:time,tags,level(JDK 10+ 推荐语法)或旧版 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log,记录每次 GC 类型、耗时、前后堆占用。 - -XX:+PrintCommandLineFlags 启动时自动打印 JVM 实际生效的参数(含隐式设置),验证配置是否被正确加载。 - -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps,发生 OOM 时自动生成堆转储,供 MAT 或 JProfiler 分析内存泄漏点。不复杂但容易忽略。

















