Spring Boot启动速度优化
一、启动时间分析
IDEA 自带集成了 async-profile 工具,所以我们可以通过火焰图来更直观的看到一些启动过程中的问题,比如下图例子当中,通过火焰图来看大量的耗时在 Bean 加载和初始化当中。
git clone https://github.com/jvm-profiling-tools/async-profiler
./profiler.sh -d 60 -o collapsed -f /tmp/profile1.svg(保存文件路径) 程序pid
./profiler.sh -d 30 -f profile1.svg 17581
二、延迟初始化
Spring Boot 2.2版本后引入 spring.main.lazy-initialization
属性,配置为 true 表示所有 Bean 都将延迟初始化。可以一定程度上提高启动速度,但是第一次访问可能较慢。
spring.main.lazy-initialization=true
三、Spring Context Indexer
Spring5 之后版本提供了spring-context-indexer
功能,主要作用是解决在类扫描的时候避免类过多导致的扫描速度过慢的问题。
使用方法也很简单,导入依赖,然后在启动类打上@Indexed
注解,这样在程序编译打包之后会生成META-INT/spring.components
文件,当执行ComponentScan
扫描类时,会读取索引文件,提高扫描速度。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<optional>true</optional>
</dependency>
四、关闭JMX
Spring Boot 2.2.X 版本以下默认会开启 JMX,可以使用 jconsole 查看,对于我们无需这些监控的话可以手动关闭它。
spring.jmx.enabled=false
五、关闭分层编译
Java8 之后的版本,默认打开多层编译,使用命令java -XX:+PrintFlagsFinal -version | grep CompileThreshold
查看。
Tier3 就是 C1、Tier4 就是 C2,表示一个方法解释编译 2000 次进行 C1编译,C1编译后执行 15000 次会进行 C2编译。
我们可以通过命令使用 C1 编译器,这样就不存在 C2 的优化阶段,能够提高启动速度,同时配合 -Xverify:none/ -noverify
关闭字节码验证,但是,尽量不要在线上环境使用。
-XX:TieredStopAtLevel=1 -noverify
参考文献:这样优化Spring Boot,启动速度快到飞起! (baidu.com)
https://baijiahao.baidu.com/s?id=1738965029536598948&wfr=spider&for=pc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)