Spring Boot毫無疑問是 Java 後端開發的第一大框架,基於Spring Boot有著一套完整的工具鏈,各種各樣的starter。對於日常業務開發而言,可以說是輪子很全。
但隨著微服務和雲端原生時代的流行,Spring Boot應用卻暴露出了一些問題,其中比較突出的有:
- 啟動慢
- 應用程式記憶體佔用多
- #雲端原生應用程式對啟動速度的要求比較高。當需要進行水平擴展時,要求這些新的實例必須在足夠短的時間內完成啟動,從而盡快的處理新增的請求。
- 雲端原生應用程式要求在執行時佔用盡可能少的資源。盡可能的減少單一實例佔用的資源,就意味著可以用同樣的成本,支援更多的存取請求。
- 雲端原生應用程式要求更小的打包體積。雲端原生應用程式以容器鏡像的形式打包。應用鏡像的尺寸越大,所需的儲存空間也會越大,推送和拉取鏡像所耗費的時間也會更長。
其實我們都比較清楚大部分的啟動時間是因為Spring 需要載入各種Bean 導致啟動速度下降的
一、延遲初始化Bean
一般在SpringBoot 中都擁有很多的耗時任務,例如資料庫建立連線、初始執行緒池的建立等等,我們可以延遲這些操作的初始化,來達到優化啟動速度的目的。 Spring Boot 2.2 版本後引入
spring.main.lazy-initialization屬性,配置為 true 會將所有 Bean 延遲初始化。
spring:main:lazy-initialization: true
個人本地開啟延遲初始化之後,啟動能快了1~2秒。
#環境 |
##設定 |
|
(十次平均值)啟動速度 |
| springboot2 jdk1.8|
#≈10.3s ########################################## ########################延遲初始化Bean### |
≈8.63s |
二、创建扫描索引
Spring5 之后提供了spring-context-indexer功能,可以通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。
先看官方的解释:
在项目中使用了@Indexed之后,编译打包的时候会在项目中自动生成META-INT/spring.components文件。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的.
我们只需要将依赖引入,然后在启动类上使用@Indexed注解即可。这样在程序编译打包之后会生成
META-INT/spring.components文件,当执行@ComponentScan扫描类时,会读取索引文件,提高扫描速度。
<dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-indexer</artifactid> <optional>true</optional></dependency>
@Indexed@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
环境 |
配置 |
(十次平均值)启动速度 |
springboot2+jdk1.8 |
≈10.3s |
|
+延迟初始化Bean |
≈8.63s |
|
+创建扫描索引 |
≈7.7s |
其他技巧:
1、減少@ComponentScan @SpringBootApplication掃描類別時候的範圍
2、關閉Spring Boot 的JMX監控,設定spring.jmx.enabled=false
3、設定JVM參數-noverify ,不對類別進行驗證
4、對非必要啟動時載入的Bean,延遲載入5、使用Spring Boot的全域懶載入一
5、AOPQ切面盡量不使用註解方式,這會導致啟動時掃描全部方法7、關閉endpoint的一些監控功能
6、排除項目多餘的依賴jar
7、swagger掃描介面時,指定只掃描某個路徑下的類別10、Feign 用戶端介面的掃描縮小套件掃描範圍
到這啟動速度應該算是最佳化的比較極致了, 但記憶體佔用大依然是問題
三、 升級jdk17
#當然jdk也在這方面做了很大的努力:
內存佔用多主要是記憶體佔用後不會歸還作業系統,這個正在逐步改善:
- #G1 JDK12及之後已支援
- ZGC JDK13及之後已支援
#由於Java語言的特性及Spring Boot的一些實作方式,決定了即便是開啟了G1/ZGC的未使用記憶體及時歸還作業系統,Spring Boot的記憶體佔用,仍然遠大於Golang這種編譯型語言。
所以,Java想要解決雲端原生時代的問題,目前的方案基本上都是基於GraalVM來的,不管是Quarkus(夸克)還是Micronaut都是。
那麼,Spring Boot有沒有類似的方案呢? :spring-graalvm-native
四、升級SpringBoot3
spring-graalvm-native是springBoo6/SpringBoot3 非常重大的特性,支援使用GraalVM 將SpringBoot 的應用程式編譯成本地可執行的鏡像文件,可以顯著提升啟動速度、峰值效能以及減少記憶體使用。
以上是維運讓我優化SpringBoot啟動速度,我是這麼乾的!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器