jvm参数优化核心目标是稳延迟、控停顿、防oom、保吞吐,需结合业务特征与硬件资源针对性调优:堆内存设固定大小(-xms=-xmx)、合理分代(-xmn占1/3~2/5)、按sla选gc器(如g1/zgc),并配置oom快照、详细gc日志及jfr实现可观测性。

堆内存:固定大小 + 合理分代
避免运行时动态扩容缩容带来的卡顿抖动:
- -Xms 和 -Xmx 必须相等,推荐设为物理内存的 50%–70%,单实例不超过 16GB(超大会增加 GC 扫描开销);例如:-Xms8g -Xmx8g
- -Xmn 设为堆的 1/3~2/5,高创建率服务(如网关、订单生成)可设至 40%,减少 Minor GC 频次;例如:-Xmn3g
- -XX:NewRatio=2(默认)通常够用,若观察到大量对象快速晋升老年代,可调小(如 NewRatio=1),扩大年轻代;配合 -XX:SurvivorRatio=8 确保 Eden 区占主导
垃圾回收器:按延迟要求选型
高并发 ≠ 一律上 G1 或 ZGC,要匹配 SLA:
- 响应时间敏感(TP99 :优先 G1,加 -XX:+UseG1GC -XX:MaxGCPauseMillis=50(目标值,非保证值),并调大 -XX:G1HeapRegionSize(如 4M)减少碎片
- 极致低延迟(TP99 :用 ZGC,配 -XX:+UseZGC -XX:ZCollectionInterval=10 -XX:ZAllocationSpikeTolerance=3.0,注意预留足够 CPU 资源
- 吞吐优先(后台聚合、报表任务):Parallel GC 更稳,-XX:+UseParallelGC -XX:ParallelGCThreads=实际可用核数×0.8
元空间与线程栈:防隐性泄漏
高频类加载(Spring Boot、热更新)、大量线程场景易出问题:
- 元空间必须设上限:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m;微服务多模块场景建议升至 768m
- -Xss 推荐 256k~512k,虚拟线程(Java 21+)下无需调大,但传统线程池若线程数 > 1000,可降至 256k 避免内存浪费;低于 256k 需压测防 StackOverflowError
兜底与可观测性:线上不可少
没监控的调优等于盲调,出问题无法归因:
- OOM 自动快照:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/jvm/dump/heap.hprof
- 详细 GC 日志:-Xlog:gc*,gc+age=trace,safepoint:file=/data/jvm/logs/gc.log:time,tags,level,pid —— JDK 11+ 推荐此格式
- 飞行记录(JFR)常开:-XX:StartFlightRecording=duration=60s,filename=/data/jvm/logs/jfr.jfr,settings=profile
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











