-Xms与-Xmx必须等值(如-Xms4g -Xmx4g)避免动态扩容引发GC毛刺;-XX:MetaspaceSize与-XX:MaxMetaspaceSize须同时设置上限(如256m/512m)防Metaspace OOM;G1为默认推荐GC器,配合-XX:+UseG1GC与-XX:MaxGCPauseMillis=200使用。

堆内存:-Xms 和 -Xmx 必须等值
初始堆(-Xms)和最大堆(-Xmx)设成相同值,是生产环境铁律。否则 JVM 运行中动态扩容会触发额外 GC,造成毛刺甚至 STW(Stop-The-World)波动。
- 典型配置:
-Xms4g -Xmx4g(适用于 16GB 物理内存服务器) - 容量建议:占物理内存的 50%–70%,微服务单实例不建议超过 4GB(避免 G1 Mixed GC 停顿失控)
- 容器场景注意:若运行在 Docker/K8s 中,需将
-Xmx设为容器内存 limit 的 70% 左右,预留空间给元空间、直接内存、线程栈等非堆开销
元空间:必须限制上限
JDK 8+ 用元空间(Metaspace)替代永久代,但默认无上限——类加载过多(如热部署、大量反射、动态代理)极易引发 OutOfMemoryError: Metaspace。
- 基础配置:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m - 监控依据:通过
jstat -gcmetacapacity <pid></pid>观察MC(Metaspace Capacity)和MU(Metaspace Used)比值,长期 >90% 就该调高 - 注意:仅设
MaxMetaspaceSize不够,还需MetaspaceSize显式设初值,否则首次扩容触发 Full GC
垃圾回收器:G1 是当前主流选择
除非明确低延迟(
- 启用与调优:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 - 配合参数:
-XX:InitiatingHeapOccupancyPercent=35(当堆使用率达 35% 时启动并发标记,避免突发 Full GC) - 日志必备:
-Xlog:gc*:file=gc.log:time,tags,level(JDK 10+ 格式),用于分析 Young GC 频率、Mixed GC 比例及停顿分布
线程与栈:别让 -Xss 拖垮并发能力
每个 Java 线程默认栈大小(-Xss)通常为 1MB,高并发服务(如 Netty、WebFlux)若未调小,极易因线程数过多导致 OutOfMemoryError: unable to create new native thread。
立即学习“Java免费学习笔记(深入)”;
- 推荐值:
-Xss256k或-Xss512k(多数 Spring Boot Web 应用足够) - 验证方法:用
jstack <pid> | wc -l</pid>查看当前线程数,结合ulimit -u确保 OS 级线程限额充足 - 慎用
-XX:ThreadStackSize(平台相关),优先用标准-Xss
系统属性与诊断:上线前必加的兜底项
这些参数不提升性能,但决定你能否快速定位问题。
- OOM 自动 dump:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/ - GC 日志归档:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M - 时区统一:
-Duser.timezone=GMT+8(避免日志时间混乱、定时任务偏移) - 字符集安全:
-Dfile.encoding=UTF-8
jstat -gc <pid></pid> 和 GC 日志交叉验证,而不是凭经验“觉得应该没问题”。


















