SpringBoot启动太慢?几个优化技巧

SpringBoot启动太慢?几个优化技巧

项目越做越大,SpringBoot启动时间从几秒变成了30多秒。

改一行代码等半分钟,效率太低了。今天分享几个优化技巧,亲测有效。

先找到慢在哪

优化之前,先看看时间花在哪了。

SpringBoot 2.4以上可以开启启动分析:

typescript 复制代码
@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:缩小包扫描范围

less 复制代码
// 优化前:扫描整个包
@SpringBootApplication
public class Application {}

// 优化后:只扫描需要的包
@SpringBootApplication(scanBasePackages = {
    "com.example.controller",
    "com.example.service",
    "com.example.config"
})
public class Application {}

包越少,扫描越快。

优化2:排除不需要的自动配置

SpringBoot会自动配置很多东西,但不是都用得上:

ruby 复制代码
@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,  // 不用数据库时
    RedisAutoConfiguration.class,        // 不用Redis时
    MongoAutoConfiguration.class,        // 不用MongoDB时
})
public class Application {}

或者在配置文件里排除:

yaml 复制代码
spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

优化3:延迟初始化

yaml 复制代码
spring:
  main:
    lazy-initialization: true

Bean在第一次使用时才初始化,不是启动时全部初始化。

注意: 第一次请求会变慢,生产环境慎用,开发环境很适合。

优化4:优化MyBatis配置

yaml 复制代码
mybatis:
  configuration:
    lazy-loading-enabled: true
  mapper-locations: classpath:mapper/*.xml  # 精确指定,不要用**

Mapper接口用@Mapper注解代替包扫描:

less 复制代码
// 不推荐
@MapperScan("com.example")

// 推荐
@Mapper
public interface UserMapper {}

优化5:关闭开发环境不需要的功能

yaml 复制代码
spring:
  profiles:
    active: dev

---
spring:
  config:
    activate:
      on-profile: dev
      
# 开发环境关闭一些功能
springdoc:
  api-docs:
    enabled: false

management:
  endpoint:
    health:
      show-details: never

优化6:JVM参数

开发环境追求启动快,可以加这些参数:

ini 复制代码
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热重载

xml 复制代码
<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生产

开发环境: 追求启动快

yaml 复制代码
spring:
  main:
    lazy-initialization: true

生产环境: 追求运行时性能

yaml 复制代码
spring:
  main:
    lazy-initialization: false

可以用不同的配置文件区分。

远程调试

有时候需要连测试环境的数据库调试,本地配置改成测试环境的地址就行:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://测试环境IP:3306/testdb

我用星空组网把本地电脑和测试环境连起来,配置文件写虚拟IP就能直接连,不用部署到服务器上调试,启动优化效果也能立刻验证。

小结

启动优化的核心思路:少加载、晚加载

  1. 缩小包扫描范围
  2. 排除不需要的自动配置
  3. 延迟初始化(开发环境)
  4. 用DevTools热重载
  5. JVM用快速启动参数

先从最简单的开始试,效果立竿见影。

有问题评论区交流~

相关推荐
玄〤几秒前
黑马点评中的分布式锁设计与实现(Redis + Redisson)
java·数据库·redis·笔记·分布式·后端
码界奇点1 分钟前
基于SpringBoot与Shiro的细粒度动态权限管理系统设计与实现
java·spring boot·后端·spring·毕业设计·源代码管理
摸鱼的春哥4 分钟前
继续AI编排实战:带截图的连麦切片文章生成
前端·javascript·后端
Yuer20255 分钟前
状态不是变量:Rust 量化算子中的 State 工程语义
开发语言·后端·深度学习·机器学习·rust
野犬寒鸦14 分钟前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
java·服务器·数据库·分布式·后端·rabbitmq
IT_陈寒14 分钟前
Vite 4.0实战:5个被低估的配置项让构建速度提升50%
前端·人工智能·后端
码界奇点22 分钟前
基于Spring Boot与MyBatis-Plus的后台管理系统设计与实现
spring boot·后端·车载系统·毕业设计·mybatis·源代码管理
sunnyday042622 分钟前
Spring Boot 应用启动成功后的事件监听与日志输出实践
java·spring boot·后端
短剑重铸之日27 分钟前
《7天学会Redis》Day 7 - Redisson 全览
java·数据库·redis·后端·缓存·redission
Qiuner28 分钟前
一文读懂 Lambda
java·spring boot·后端·架构