最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項目啟動速度深度優(yōu)化指南

 更新時間:2026年05月15日 09:42:20   作者:河阿里  
本文介紹了Spring Boot 2.7.x~3.2.x的啟動優(yōu)化方法,從依賴優(yōu)化、自動配置優(yōu)化、Bean掃描與注冊優(yōu)化、懶加載優(yōu)化、初始化邏輯優(yōu)化、JVM調(diào)優(yōu)等多方面進行詳細闡述,通過依賴優(yōu)化、禁用不必要的自動配置、縮小Bean掃描范圍、全局開啟懶加載等策略,需要的朋友可以參考下

適用版本:SpringBoot 2.7.x ~ 3.2.x
調(diào)優(yōu)目標(biāo):將中小型應(yīng)用啟動時間從10-30秒優(yōu)化至3-8秒,大型應(yīng)用從60秒以上優(yōu)化至20秒以內(nèi)

一、問題分析

SpringBoot 憑借"約定大于配置"的理念極大提升了開發(fā)效率,但隨著項目規(guī)模擴大和依賴增多,啟動速度會急劇下降。慢啟動不僅影響開發(fā)體驗(熱部署等待時間長),還會降低生產(chǎn)環(huán)境的彈性伸縮能力(K8s Pod 啟動超時、滾動更新緩慢)。

1.1 SpringBoot 核心啟動流程(耗時分布)

一個典型的 SpringBoot 應(yīng)用啟動分為以下5個階段,各階段耗時占比大致如下:

階段耗時占比核心操作
JVM啟動與類加載20%~30%JVM初始化、字節(jié)碼加載、驗證、準(zhǔn)備、解析
Spring上下文構(gòu)建40%~60%Bean掃描、自動配置、Bean定義注冊
Bean實例化與依賴注入15%~25%單例Bean創(chuàng)建、依賴注入、AOP代理生成
應(yīng)用初始化5%~15%CommandLineRunner、ApplicationRunner執(zhí)行
Web服務(wù)器啟動5%~10%Tomcat/Jetty/Undertow初始化、端口綁定

1.2 啟動速度診斷工具

在進行調(diào)優(yōu)前,必須先通過工具定位瓶頸,避免盲目優(yōu)化:

1.2.1 內(nèi)置啟動分析器(SpringBoot 2.4+)

# 開啟啟動時間記錄
spring.main.startup-time=true
# 輸出詳細的Bean創(chuàng)建耗時
logging.level.org.springframework.beans.factory.support.DefaultListableBeanFactory=DEBUG

1.2.2 Spring Boot Actuator 端點

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management.endpoints.web.exposure.include=startup
management.endpoint.startup.enabled=true

訪問 http://localhost:8080/actuator/startup 獲取結(jié)構(gòu)化的啟動數(shù)據(jù)。

二、調(diào)優(yōu)策略

2.1 依賴優(yōu)化(最直接有效的優(yōu)化手段)

2.1.1 移除未使用的依賴

SpringBoot 自動配置會根據(jù)依賴存在與否激活相應(yīng)功能,多余的依賴會導(dǎo)致大量不必要的自動配置執(zhí)行。

操作步驟

  1. 使用 mvn dependency:analyze 分析未使用的依賴
  2. 移除 spring-boot-starter-* 中不需要的傳遞依賴
  3. 避免引入"全家桶"式依賴(如 spring-cloud-starter

示例

<!-- 錯誤:引入了不必要的web依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 正確:只保留需要的依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 排除不需要的傳遞依賴 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

2.1.2 優(yōu)化依賴版本與范圍

  • 使用 spring-boot-dependencies 管理依賴版本,避免版本沖突
  • 將測試依賴的 scope 設(shè)置為 test
  • 對于僅在編譯時需要的依賴,使用 provided scope

2.1.3 替換重量級依賴

重量級依賴輕量級替代方案啟動時間提升
TomcatUndertow/Jetty10%~20%
Hibernate ValidatorSpring Validation5%~10%
JacksonFastjson2(謹慎使用)5%~15%
Spring Data JPAMyBatis-Plus/原生MyBatis20%~40%

2.2 自動配置優(yōu)化

SpringBoot 的自動配置雖然方便,但會掃描大量條件注解,執(zhí)行大量條件判斷。

2.2.1 排除不需要的自動配置

@SpringBootApplication(
    exclude = {
        DataSourceAutoConfiguration.class,
        RedisAutoConfiguration.class,
        SecurityAutoConfiguration.class,
        ThymeleafAutoConfiguration.class,
        MailSenderAutoConfiguration.class
    }
)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

技巧:通過 --debug 參數(shù)啟動應(yīng)用,查看所有自動配置的匹配情況:

java -jar app.jar --debug

2.2.2 禁用JMX支持(生產(chǎn)環(huán)境)

# 禁用JMX自動配置
spring.jmx.enabled=false
# 禁用端點JMX暴露
management.endpoints.jmx.exposure.exclude=*

效果:減少約5%~10%的啟動時間。

2.2.3 禁用不必要的AOP自動配置

# 禁用Spring AOP自動代理(如果不使用AOP)
spring.aop.auto=false
# 禁用事務(wù)AOP(如果不使用聲明式事務(wù))
spring.transaction.auto=false

2.3 Bean掃描與注冊優(yōu)化

2.3.1 縮小Bean掃描范圍

默認情況下,@SpringBootApplication 會掃描主類所在包及其子包下的所有類。如果項目結(jié)構(gòu)復(fù)雜,掃描范圍過大將嚴重影響啟動速度。

優(yōu)化方案

// 明確指定掃描的包,避免掃描無關(guān)目錄
@SpringBootApplication(scanBasePackages = "com.company.project")
// 更精確:只掃描包含組件的包
@ComponentScan(basePackages = {
    "com.company.project.controller",
    "com.company.project.service",
    "com.company.project.mapper"
})

建議

  • 主類放在最頂層包下
  • 避免將無關(guān)的類放在掃描路徑下
  • 不要使用 @ComponentScan("com.company") 掃描整個公司包

2.3.2 使用@Configuration替代@Component進行配置

@Configuration 類會被 CGLIB 代理,但在啟動時處理更快,且能更好地控制Bean的創(chuàng)建順序。

2.3.3 避免使用@Component注解在抽象類和接口上

抽象類和接口上的 @Component 注解會被Spring忽略,但會增加掃描時間。

2.4 懶加載優(yōu)化

懶加載(Lazy Initialization)是指Bean在第一次被使用時才創(chuàng)建,而不是在應(yīng)用啟動時創(chuàng)建。這是提升啟動速度最有效的手段之一。

2.4.1 全局開啟懶加載(SpringBoot 2.2+)

# 全局開啟懶加載
spring.main.lazy-initialization=true

注意事項

  • 全局懶加載會延遲所有Bean的創(chuàng)建,包括Web服務(wù)器、數(shù)據(jù)源等核心組件
  • 第一次請求的響應(yīng)時間會變長
  • 某些依賴啟動時初始化的功能可能會失效(如定時任務(wù))

2.4.2 選擇性懶加載(推薦)

// 對單個Bean使用懶加載
@Service
@Lazy
public class HeavyService {
    // 耗時的初始化操作
}

// 對配置類中的所有Bean使用懶加載
@Configuration
@Lazy
public class HeavyConfig {
    @Bean
    public HeavyBean heavyBean() {
        return new HeavyBean();
    }
}

2.4.3 排除關(guān)鍵Bean的懶加載

@Configuration
public class CriticalConfig {
    // 關(guān)鍵Bean不使用懶加載
    @Bean
    @Lazy(false)
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

2.5 初始化邏輯優(yōu)化

2.5.1 優(yōu)化@PostConstruct方法

@PostConstruct 方法會在Bean創(chuàng)建后立即執(zhí)行,耗時的初始化操作會阻塞啟動流程。

優(yōu)化方案

// 錯誤:在@PostConstruct中執(zhí)行耗時操作
@Service
public class BadService {
    @PostConstruct
    public void init() {
        // 耗時操作:加載大量數(shù)據(jù)、調(diào)用外部接口
        loadLargeData();
    }
}

// 正確:使用異步初始化
@Service
public class GoodService {
    @PostConstruct
    public void init() {
        CompletableFuture.runAsync(this::loadLargeData);
    }
    
    private void loadLargeData() {
        // 耗時操作
    }
}

2.5.2 優(yōu)化CommandLineRunner和ApplicationRunner

  • 將非關(guān)鍵的初始化邏輯移至異步線程
  • 按優(yōu)先級排序,先執(zhí)行關(guān)鍵初始化
  • 避免在Runner中執(zhí)行耗時操作
@Component
@Order(1) // 高優(yōu)先級,先執(zhí)行
public class CriticalRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        // 關(guān)鍵初始化邏輯
    }
}

@Component
@Order(2)
public class NonCriticalRunner implements CommandLineRunner {
    @Autowired
    private TaskExecutor taskExecutor;
    
    @Override
    public void run(String... args) throws Exception {
        taskExecutor.execute(() -> {
            // 非關(guān)鍵初始化邏輯
        });
    }
}

2.5.3 避免在Bean構(gòu)造函數(shù)中執(zhí)行耗時操作

構(gòu)造函數(shù)中的代碼會在Bean實例化時執(zhí)行,會阻塞整個Bean的創(chuàng)建過程。

2.6 JVM調(diào)優(yōu)

JVM參數(shù)對啟動速度有顯著影響,不同的JVM版本和垃圾回收器表現(xiàn)差異很大。

2.6.1 推薦JVM參數(shù)(Java 17+)

java -jar \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+TieredCompilation \
  -XX:TieredStopAtLevel=1 \
  -Xms512m \
  -Xmx1024m \
  -XX:+UseStringDeduplication \
  -XX:+DisableAttachMechanism \
  app.jar

關(guān)鍵參數(shù)說明

  • -XX:+TieredCompilation:開啟分層編譯,提升啟動速度
  • -XX:TieredStopAtLevel=1:只使用C1編譯器,大幅提升啟動速度(適合開發(fā)環(huán)境)
  • -XX:+UseG1GC:G1垃圾回收器在啟動速度和吞吐量之間取得平衡
  • -Xms-Xmx 設(shè)置為相同值,避免堆內(nèi)存調(diào)整帶來的開銷

2.6.2 Java 11 vs Java 17 啟動性能對比

Java 17 在啟動速度上有顯著提升,建議升級到最新的LTS版本:

  • 類加載速度提升約15%
  • JIT編譯速度提升約20%
  • 內(nèi)存占用減少約10%

2.7 開發(fā)環(huán)境專屬優(yōu)化

開發(fā)環(huán)境對啟動速度的要求更高,以下優(yōu)化僅適用于開發(fā)環(huán)境:

2.7.1 使用 Spring Boot DevTools

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

DevTools 提供了快速重啟功能,只重新加載變化的類,重啟時間通常在1-2秒。

2.7.2 禁用緩存和模板引擎緩存

# 禁用模板引擎緩存
spring.thymeleaf.cache=false
spring.freemarker.cache=false
# 禁用靜態(tài)資源緩存
spring.web.resources.cache.period=0
# 禁用Hibernate二級緩存
spring.jpa.properties.hibernate.cache.use_second_level_cache=false

三、高級調(diào)優(yōu)策略

3.1 使用 Spring Boot 3.x 與 GraalVM 原生鏡像

Spring Boot 3.x 引入了對 GraalVM 原生鏡像的支持,可以將應(yīng)用編譯成本地可執(zhí)行文件,啟動時間可降至毫秒級。

優(yōu)勢

  • 啟動時間:從秒級降至毫秒級(通常<100ms)
  • 內(nèi)存占用:減少約50%
  • 容器鏡像大?。簻p少約70%

限制

  • 不支持動態(tài)類加載和反射(需要額外配置)
  • 編譯時間長
  • 某些第三方庫可能不兼容

3.2 模塊化應(yīng)用(Java 9+)

使用Java模塊系統(tǒng)(JPMS)可以精確控制類加載,減少不必要的類加載:

module com.company.project {
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.web;
    
    exports com.company.project;
}

3.3 拆分大型應(yīng)用

對于超大型應(yīng)用,最佳的優(yōu)化方案是進行微服務(wù)拆分,將單一應(yīng)用拆分為多個小型服務(wù),每個服務(wù)的啟動時間都會顯著降低。

四、調(diào)優(yōu)效果評估

4.1 調(diào)優(yōu)前后對比(示例中小型應(yīng)用)

調(diào)優(yōu)階段啟動時間優(yōu)化幅度
未調(diào)優(yōu)18秒0%
依賴優(yōu)化12秒33%
自動配置優(yōu)化9秒25%
Bean掃描優(yōu)化7秒22%
懶加載優(yōu)化4秒43%
JVM調(diào)優(yōu)3秒25%
總計3秒83%

4.2 調(diào)優(yōu)效果驗證方法

  1. 多次啟動應(yīng)用,取平均值(避免單次啟動的偶然性)
  2. 對比調(diào)優(yōu)前后的啟動日志,查看各階段耗時變化
  3. 使用壓測工具驗證應(yīng)用性能是否受到影響
  4. 檢查所有功能是否正常運行

五、調(diào)優(yōu)注意事項

  1. 先診斷后優(yōu)化:永遠不要在沒有定位瓶頸的情況下進行盲目優(yōu)化
  2. 平衡啟動速度與運行時性能:某些優(yōu)化(如分層編譯停止在Level 1)會降低運行時性能,僅適用于開發(fā)環(huán)境
  3. 避免過度優(yōu)化:不要為了幾毫秒的提升而犧牲代碼的可讀性和可維護性
  4. 持續(xù)監(jiān)控:隨著項目的迭代,啟動速度可能會再次變慢,需要定期進行監(jiān)控和優(yōu)化
  5. 團隊規(guī)范:制定團隊開發(fā)規(guī)范,避免引入不必要的依賴和配置

以上就是SpringBoot項目啟動速度深度優(yōu)化指南的詳細內(nèi)容,更多關(guān)于SpringBoot項目啟動速度優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot?整合?Spring-Session?實現(xiàn)分布式會話項目實戰(zhàn)

    SpringBoot?整合?Spring-Session?實現(xiàn)分布式會話項目實戰(zhàn)

    本文主要介紹了SpringBoot?整合?Spring-Session?實現(xiàn)分布式會話項目實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Mybatis使用Collection屬性的示例代碼

    Mybatis使用Collection屬性的示例代碼

    本文主要介紹了Mybatis使用Collection屬性的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java后端訪問https證書的問題及解決

    java后端訪問https證書的問題及解決

    這篇文章主要介紹了java后端訪問https證書的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java中Singleton的3種實現(xiàn)方式詳解

    Java中Singleton的3種實現(xiàn)方式詳解

    這篇文章主要給大家介紹了關(guān)于Java中Singleton的3種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java 記錄一個子串在整串中出現(xiàn)的次數(shù)實例

    java 記錄一個子串在整串中出現(xiàn)的次數(shù)實例

    今天小編就為大家分享一篇java 記錄一個子串在整串中出現(xiàn)的次數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot多環(huán)境日志配置方式

    SpringBoot多環(huán)境日志配置方式

    SpringBoot?默認使用LogBack日志系統(tǒng),默認情況下,SpringBoot項目的日志只會在控制臺輸入,本文給大家介紹SpringBoot多環(huán)境日志配置方式,需要的朋友可以參考下
    2024-08-08
  • Java設(shè)計模式之橋模式(Bridge模式)介紹

    Java設(shè)計模式之橋模式(Bridge模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實現(xiàn)橋模式、Bridge模式在EJB中的應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • spring cloud內(nèi)容匯總(各個功能模塊、啟動、部署)的詳細過程

    spring cloud內(nèi)容匯總(各個功能模塊、啟動、部署)的詳細過程

    Spring Cloud 是一套基于 Spring Boot 的框架集合,用于構(gòu)建分布式微服務(wù)架構(gòu),文章介紹了Spring Cloud框架及其相關(guān)工具的使用,還詳細介紹了如何配置和使用這些功能,包括配置文件、依賴管理以及實際應(yīng)用示例,感興趣的朋友一起看看吧
    2024-11-11
  • 在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程

    在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程

    這篇文章主要介紹了在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程,需要的朋友可以參考下
    2020-07-07
  • Java實戰(zhàn)之火車票預(yù)訂系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之火車票預(yù)訂系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了利用Java實現(xiàn)的火車票預(yù)訂系統(tǒng),文中用到了JSP?、Servlert、JQuery、Ajax?等技術(shù),文中示例代碼講解詳細,需要的可以參考一下
    2022-02-02

最新評論

南漳县| 汉中市| 中山市| 轮台县| 佛冈县| 那曲县| 永州市| 文化| 康定县| 彩票| 宁河县| 怀远县| 滁州市| 炉霍县| 尼玛县| 安仁县| 平凉市| 宿松县| 苏尼特左旗| 吉木乃县| 泽普县| 江源县| 正定县| 阿克陶县| 临桂县| 天峨县| 昂仁县| 平凉市| 枞阳县| 商南县| 古浪县| 腾冲县| 临沭县| 海伦市| 乌拉特中旗| 驻马店市| 定陶县| 丽水市| 谢通门县| 临潭县| 舞钢市|