springboot启动太慢?几个优化技巧
项目越做越大,springboot启动时间从几秒变成了30多秒。
改一行代码等半分钟,效率太低了。今天分享几个优化技巧,亲测有效。
先找到慢在哪
优化之前,先看看时间花在哪了。
springboot 2.4以上可以开启启动分析:
@springbootapplication
public class application {
public static void main(string[] args) {
springapplication app = new springapplication(application.class);
app.setapplicationstartup(new bufferingapplicationstartup(2048));
app.run(args);
}
}
启动后访问/actuator/startup就能看到每个步骤的耗时。
常见的耗时大户:
- 包扫描范围太大
- 自动配置太多
- 数据源初始化
- mybatis mapper扫描
优化1:缩小包扫描范围
// 优化前:扫描整个包
@springbootapplication
public class application {}
// 优化后:只扫描需要的包
@springbootapplication(scanbasepackages = {
"com.example.controller",
"com.example.service",
"com.example.config"
})
public class application {}
包越少,扫描越快。
优化2:排除不需要的自动配置
springboot会自动配置很多东西,但不是都用得上:
@springbootapplication(exclude = {
datasourceautoconfiguration.class, // 不用数据库时
redisautoconfiguration.class, // 不用redis时
mongoautoconfiguration.class, // 不用mongodb时
})
public class application {}
或者在配置文件里排除:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.datasourceautoconfiguration
优化3:延迟初始化
spring:
main:
lazy-initialization: truebean在第一次使用时才初始化,不是启动时全部初始化。
注意: 第一次请求会变慢,生产环境慎用,开发环境很适合。
优化4:优化mybatis配置
mybatis:
configuration:
lazy-loading-enabled: true
mapper-locations: classpath:mapper/*.xml # 精确指定,不要用**
mapper接口用@mapper注解代替包扫描:
// 不推荐
@mapperscan("com.example")
// 推荐
@mapper
public interface usermapper {}
优化5:关闭开发环境不需要的功能
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
# 开发环境关闭一些功能
springdoc:
api-docs:
enabled: false
management:
endpoint:
health:
show-details: never
优化6:jvm参数
开发环境追求启动快,可以加这些参数:
java -xx:tieredstopatlevel=1 \
-noverify \
-dspring.jmx.enabled=false \
-jar app.jar
-xx:tieredstopatlevel=1只用c1编译,启动更快-noverify跳过字节码验证-dspring.jmx.enabled=false关闭jmx
大约能提升20%左右。
优化7:使用devtools热重载
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-devtools</artifactid>
<scope>runtime</scope>
</dependency>
改代码后不用完全重启,只重新加载变化的部分,几秒就能生效。
优化效果
| 优化项 | 优化前 | 优化后 |
|---|---|---|
| 缩小包扫描 | 30s | 27s |
| 排除自动配置 | 27s | 20s |
| 延迟初始化 | 20s | 12s |
| jvm参数 | 12s | 10s |
| devtools | 10s | 3s |
从30秒到3秒,效率提升10倍。
开发vs生产
开发环境: 追求启动快
spring:
main:
lazy-initialization: true
生产环境: 追求运行时性能
spring:
main:
lazy-initialization: false
可以用不同的配置文件区分。
远程调试
有时候需要连测试环境的数据库调试,本地配置改成测试环境的地址就行:
spring:
datasource:
url: jdbc:mysql://测试环境ip:3306/testdb
把本地电脑和测试环境连起来,配置文件写虚拟ip就能直接连,不用部署到服务器上调试,启动优化效果也能立刻验证。
小结
启动优化的核心思路:少加载、晚加载
- 缩小包扫描范围
- 排除不需要的自动配置
- 延迟初始化(开发环境)
- 用devtools热重载
- jvm用快速启动参数
先从最简单的开始试,效果立竿见影。
到此这篇关于springboot启动太慢的7个优化技巧的文章就介绍到这了,更多相关springboot启动优化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论