jvm参数优化核心是堆内存稳定、回收器匹配负载、非堆区域受控:-xms与-xmx设为相同值(如-xms4g -xmx4g)避免扩容抖动;年轻代用-xmn显式指定(如-xmn1536m);按场景选g1(低延迟)、parallel(高吞吐)或zgc(大堆+jdk11+);元空间加限(-xx:metaspacesize=256m -xx:maxmetaspacesize=512m);线程栈调小(-xss256k);必开gc日志与oom自动dump。

核心是让堆内存稳定、回收器匹配负载、非堆区域不拖后腿。不是参数越多越好,而是每项都得有依据。
堆内存大小设成一样
用 -Xms 和 -Xmx 把初始堆和最大堆设成相同值,比如 -Xms4g -Xmx4g。这样 JVM 启动就直接分配好空间,避免运行中反复扩容缩容带来的 GC 波动和系统调用开销。尤其在流量突增时,这点很关键。
- 服务器物理内存 16G,堆一般别超 12G,留足给元空间、栈、直接内存和 OS
- 年轻代建议占堆的 1/3 到 1/2,可用 -Xmn 显式指定,比如
-Xmn1536m - 不要依赖默认的 -XX:NewRatio,短生命周期对象多的应用,年轻代小了会频繁 Minor GC
按场景选对垃圾回收器
回收器不是越新越好,得看你的延迟和吞吐量哪边更敏感:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 响应时间敏感(如 API 服务):优先试 G1(
-XX:+UseG1GC),再调 -XX:MaxGCPauseMillis=200 控制停顿目标 - 后台批处理类任务:用 Parallel GC(
-XX:+UseParallelGC),吞吐量优先 - 堆超 16G 且 JDK ≥ 11:可评估 ZGC(
-XX:+UseZGC),目标是毫秒级停顿 - CMS 已在 JDK 14 中移除,新项目别再用
管住元空间和线程栈
这两个区域容易被忽略,但一出问题就是 Full GC 或 OOM:
- 元空间加限制:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m,防止动态类加载(如 Spring Boot、热更新)导致无限扩张 - 线程栈默认 1M,高并发应用线程数多时容易耗尽内存,可降到
-Xss256k或-Xss512k,但要测试是否触发 StackOverflowError - 如果用了大量反射或动态代理,元空间可能需要更大,观察
java.lang.ClassLoader数量和 Metaspace 使用率
必须打开基础监控开关
没日志等于盲调。上线前至少加上这几项:
-
-Xlog:gc*:file=gc.log:time,level,tags:filecount=5,filesize=20M(JDK 10+ 推荐格式) - 老版本 JDK 可用:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log - 加一个兜底:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/,OOM 时自动抓堆快照 - 配合
jstat -gc <pid> 1s</pid>实时看 GC 频率和各区使用率,比只看日志更快定位趋势
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










