SpringBoot啟動太慢的7個優(yōu)化技巧
SpringBoot啟動太慢?幾個優(yōu)化技巧
項目越做越大,SpringBoot啟動時間從幾秒變成了30多秒。
改一行代碼等半分鐘,效率太低了。今天分享幾個優(yōu)化技巧,親測有效。
先找到慢在哪
優(yōu)化之前,先看看時間花在哪了。
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就能看到每個步驟的耗時。
常見的耗時大戶:
- 包掃描范圍太大
- 自動配置太多
- 數(shù)據(jù)源初始化
- MyBatis Mapper掃描
優(yōu)化1:縮小包掃描范圍
// 優(yōu)化前:掃描整個包
@SpringBootApplication
public class Application {}
// 優(yōu)化后:只掃描需要的包
@SpringBootApplication(scanBasePackages = {
"com.example.controller",
"com.example.service",
"com.example.config"
})
public class Application {}
包越少,掃描越快。
優(yōu)化2:排除不需要的自動配置
SpringBoot會自動配置很多東西,但不是都用得上:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class, // 不用數(shù)據(jù)庫時
RedisAutoConfiguration.class, // 不用Redis時
MongoAutoConfiguration.class, // 不用MongoDB時
})
public class Application {}
或者在配置文件里排除:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
優(yōu)化3:延遲初始化
spring:
main:
lazy-initialization: trueBean在第一次使用時才初始化,不是啟動時全部初始化。
注意: 第一次請求會變慢,生產(chǎn)環(huán)境慎用,開發(fā)環(huán)境很適合。
優(yōu)化4:優(yōu)化MyBatis配置
mybatis:
configuration:
lazy-loading-enabled: true
mapper-locations: classpath:mapper/*.xml # 精確指定,不要用**
Mapper接口用@Mapper注解代替包掃描:
// 不推薦
@MapperScan("com.example")
// 推薦
@Mapper
public interface UserMapper {}
優(yōu)化5:關閉開發(fā)環(huán)境不需要的功能
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
# 開發(fā)環(huán)境關閉一些功能
springdoc:
api-docs:
enabled: false
management:
endpoint:
health:
show-details: never
優(yōu)化6:JVM參數(shù)
開發(fā)環(huán)境追求啟動快,可以加這些參數(shù):
java -XX:TieredStopAtLevel=1 \
-noverify \
-Dspring.jmx.enabled=false \
-jar app.jar
-XX:TieredStopAtLevel=1只用C1編譯,啟動更快-noverify跳過字節(jié)碼驗證-Dspring.jmx.enabled=false關閉JMX
大約能提升20%左右。
優(yōu)化7:使用DevTools熱重載
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
改代碼后不用完全重啟,只重新加載變化的部分,幾秒就能生效。
優(yōu)化效果
| 優(yōu)化項 | 優(yōu)化前 | 優(yōu)化后 |
|---|---|---|
| 縮小包掃描 | 30s | 27s |
| 排除自動配置 | 27s | 20s |
| 延遲初始化 | 20s | 12s |
| JVM參數(shù) | 12s | 10s |
| DevTools | 10s | 3s |
從30秒到3秒,效率提升10倍。
開發(fā)vs生產(chǎn)
開發(fā)環(huán)境: 追求啟動快
spring:
main:
lazy-initialization: true
生產(chǎn)環(huán)境: 追求運行時性能
spring:
main:
lazy-initialization: false
可以用不同的配置文件區(qū)分。
遠程調試
有時候需要連測試環(huán)境的數(shù)據(jù)庫調試,本地配置改成測試環(huán)境的地址就行:
spring:
datasource:
url: jdbc:mysql://測試環(huán)境IP:3306/testdb
把本地電腦和測試環(huán)境連起來,配置文件寫虛擬IP就能直接連,不用部署到服務器上調試,啟動優(yōu)化效果也能立刻驗證。
小結
啟動優(yōu)化的核心思路:少加載、晚加載
- 縮小包掃描范圍
- 排除不需要的自動配置
- 延遲初始化(開發(fā)環(huán)境)
- 用DevTools熱重載
- JVM用快速啟動參數(shù)
先從最簡單的開始試,效果立竿見影。
到此這篇關于SpringBoot啟動太慢的7個優(yōu)化技巧的文章就介紹到這了,更多相關SpringBoot啟動優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換的示例代碼
在當今的互聯(lián)網(wǎng)應用中,微服務大行其道,隨著業(yè)務的發(fā)展和擴展,單一的數(shù)據(jù)庫無法滿足日益增長的數(shù)據(jù)需求,本文將基于 JDK17 + Spring Boot 3 和 MyBatis 框架實現(xiàn)動態(tài)切換數(shù)據(jù)源功能,需要的朋友可以參考下2024-09-09
SpringCloud實現(xiàn)文件上傳功能的方法詳解
這篇文章主要為大家詳細介紹了SpringCloud如何實現(xiàn)文件上傳功能,文中的示例代碼講解詳細,對我們學習有一定的借鑒價值,需要的可以參考一下2022-08-08
SpringBoot實現(xiàn)excel生成并且通過郵件發(fā)送的步驟詳解
實際開發(fā)中,特別是在B端產(chǎn)品的開發(fā)中,我們經(jīng)常會遇到導出excel的功能,更進階一點的需要我們定期生成統(tǒng)計報表,然后通過郵箱發(fā)送給指定的人員,?今天要帶大家來實現(xiàn)的就是excel生成并通過郵件發(fā)送,需要的朋友可以參考下2023-10-10
SpringBoot+slf4j實現(xiàn)全鏈路調用日志跟蹤的方法(一)
本文重點給大家介紹Tracer集成的slf4j MDC功能,方便用戶在只簡單修改日志配置文件的前提下輸出當前 Tracer 上下文 TraceId,文章通過代碼給大家講解了在springboot中使用的技巧,感興趣的朋友跟隨小編一起看看吧2021-05-05
基于JavaSwing設計和實現(xiàn)的酒店管理系統(tǒng)
這篇文章主要介紹了基于JavaSwing+mysql的酒店管理系統(tǒng)設計和實現(xiàn),它可以實現(xiàn)酒店日常的管理功能包括開房、退房、房間信息、顧客信息管理等2021-08-08

