SpringBoot啟動太慢的7個(gè)優(yōu)化技巧
SpringBoot啟動太慢?幾個(gè)優(yōu)化技巧
項(xiàng)目越做越大,SpringBoot啟動時(shí)間從幾秒變成了30多秒。
改一行代碼等半分鐘,效率太低了。今天分享幾個(gè)優(yōu)化技巧,親測有效。
先找到慢在哪
優(yōu)化之前,先看看時(shí)間花在哪了。
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就能看到每個(gè)步驟的耗時(shí)。
常見的耗時(shí)大戶:
- 包掃描范圍太大
- 自動配置太多
- 數(shù)據(jù)源初始化
- MyBatis Mapper掃描
優(yōu)化1:縮小包掃描范圍
// 優(yōu)化前:掃描整個(gè)包
@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ù)庫時(shí)
RedisAutoConfiguration.class, // 不用Redis時(shí)
MongoAutoConfiguration.class, // 不用MongoDB時(shí)
})
public class Application {}
或者在配置文件里排除:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
優(yōu)化3:延遲初始化
spring:
main:
lazy-initialization: trueBean在第一次使用時(shí)才初始化,不是啟動時(shí)全部初始化。
注意: 第一次請求會變慢,生產(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:關(guān)閉開發(fā)環(huán)境不需要的功能
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
# 開發(fā)環(huán)境關(guā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é)碼驗(yàn)證-Dspring.jmx.enabled=false關(guān)閉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)化項(xiàng) | 優(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)境: 追求運(yùn)行時(shí)性能
spring:
main:
lazy-initialization: false
可以用不同的配置文件區(qū)分。
遠(yuǎn)程調(diào)試
有時(shí)候需要連測試環(huán)境的數(shù)據(jù)庫調(diào)試,本地配置改成測試環(huán)境的地址就行:
spring:
datasource:
url: jdbc:mysql://測試環(huán)境IP:3306/testdb
把本地電腦和測試環(huán)境連起來,配置文件寫虛擬IP就能直接連,不用部署到服務(wù)器上調(diào)試,啟動優(yōu)化效果也能立刻驗(yàn)證。
小結(jié)
啟動優(yōu)化的核心思路:少加載、晚加載
- 縮小包掃描范圍
- 排除不需要的自動配置
- 延遲初始化(開發(fā)環(huán)境)
- 用DevTools熱重載
- JVM用快速啟動參數(shù)
先從最簡單的開始試,效果立竿見影。
到此這篇關(guān)于SpringBoot啟動太慢的7個(gè)優(yōu)化技巧的文章就介紹到這了,更多相關(guān)SpringBoot啟動優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解在springmvc中解決FastJson循環(huán)引用的問題
本篇文章主要介紹了在springmvc中解決FastJson循環(huán)引用的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Java實(shí)現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信
這篇文章主要為大家詳細(xì)介紹了Java語言如何利用圖片或視頻實(shí)現(xiàn)生成GIF并發(fā)送微信的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11
JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析
以下是對小編對JAVA多線程與并發(fā)的學(xué)習(xí)進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下2013-08-08

