SpringBoot应用启动速度过慢问题解决
慢在哪里?
使用IDEA的Async Profiler进行分析:
第一个图是火焰图,Y轴代表调用栈,每一层都是一个函数,调用栈越深,火焰越高,顶部的就是正在执行的函数,下方都是他的父函数;X轴表示抽样数,一个函数在X轴占据的宽度越宽,表示他被抽到的次数越多,即执行的时间越长。

第二个标签是调用树(Call Tree),展示了在每个方法中子方法的耗时占比(严格的说是CPU sample占比)

怎么优化启动速度?
减少业务初始化
没有必要启动就初始化的业务能异步就异步。
延迟初始化
spring.main.lazy-initialization=true配置后所有的bean都将延迟初始化,这个会一定程度上提高启动速度,但是会导致第一次访问时较慢。
使用indexer
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<optional>true</optional>
</dependency>
主要作用是解决在类扫描时避免类过多导致扫描速度过慢的问题。
使用方式:导入依赖=》在启动类上面写上@Indexed注解,这样在程序编译打包之后会生成META-lNT/spring.components文件,当执行’ComponentScan’扫描类时会读取索引文件提高扫描速度。
关闭JMX
spring.jmx.enabled=false
springboot 2.2以下的版本默认会开启jmx
关闭分层编译
Java8以后的版本默认打开多层编译,使用命令查看
java -XX:+PrintFlagsFinal -version | grep CompileThreshold
==不建议在线上环境使用==
参考/原文:
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果