Spring Boot性能优化核心是合理配置JVM:堆内存需固定-Xms与-Xmx值防抖动,元空间应按依赖规模调优防溢出,同时选对GC回收器、控制启动开销。

Spring Boot 应用的运行性能,很大程度上取决于 JVM 的配置是否合理。不调优的默认参数往往面向通用场景,而实际业务负载、内存压力和响应要求差异很大——直接套用容易导致 GC 频繁、启动慢、停顿长甚至 OOM。核心优化方向很明确:稳住堆内存、选对回收器、控好元空间、减少启动开销。
堆内存与元空间:避免抖动和溢出
堆内存设置不当是性能波动的常见源头。-Xms 和 -Xmx 必须设为相同值,比如 -Xms2g -Xmx2g,否则 JVM 在运行中动态扩容缩容会触发额外 GC 和锁竞争。实测显示,未固定堆大小的应用在高并发初期常出现 10%~15% 的吞吐下降。
元空间(Metaspace)管理类元数据,Spring Boot 启动时加载大量自动配置类、Bean 定义、代理类,容易撑爆默认值。建议根据依赖规模设定:
• 小型服务(-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
• 中大型微服务(含 MyBatis、Spring Cloud、RabbitMQ 等):-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
超出上限会触发 Full GC,且无法通过常规堆参数缓解。
G1 垃圾回收器:低延迟场景的首选
对 Web/API 类 Spring Boot 应用,G1 是平衡吞吐与停顿的最优解。启用方式简单:-XX:+UseG1GC,但仅开启不够,还需关键调优:
- -XX:MaxGCPauseMillis=200:设定目标停顿时间(单位毫秒),G1 会据此动态调整回收区域数量和并发线程数
- -XX:InitiatingHeapOccupancyPercent=35:当堆使用率达 35% 就提前启动混合回收,避免堆积到 70%+ 才触发,大幅降低单次 GC 压力
- -XX:+ParallelRefProcEnabled:并行处理软/弱引用,在大量缓存或 WebSocket 场景下显著缩短 STW 时间
注意:JDK 9+ 默认 G1,但旧版需显式指定;若用 JDK 17+ 且 SLA 要求亚百毫秒停顿,可评估 ZGC(-XX:+UseZGC),但需确认所有依赖兼容。
立即学习“Java免费学习笔记(深入)”;
启动加速:被忽视的“冷启动”优化
Spring Boot 启动慢常被归咎于自动配置,其实 JVM 层面有更快见效的开关:
- -XX:TieredStopAtLevel=1:跳过 C2 编译器的激进优化阶段,让 JIT 快速进入稳定态,适合短生命周期或预热不足的服务
- -Xverify:none:关闭字节码验证(仅限可信环境),实测可缩减 300~500ms 启动耗时
- -XX:+AlwaysPreTouch:启动时立即分配并访问全部堆内存页,避免运行中缺页中断,尤其对大堆(≥4G)效果明显
组合示例:
java -XX:TieredStopAtLevel=1 -Xverify:none -XX:+AlwaysPreTouch -Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
线程与栈:多线程场景下的资源精打细算
Spring Boot 默认使用 Tomcat,每个请求独占线程。若应用频繁创建线程(如异步任务、定时调度),默认栈大小(-Xss1m)易造成内存浪费。可安全下调至:-Xss256k 或 -Xss512k,在 4C8G 机器上可多支撑 2~3 倍线程数。
同时检查应用层线程池配置(如 @Async 的 ThreadPoolTaskExecutor),避免无限制创建线程——JVM 参数只是底座,上层资源管控必须同步收紧。



















