維運讓我優化SpringBoot啟動速度,我是這麼乾的!
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
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

對於機械硬碟、或SATA固態硬碟,軟體運轉速度的提升會有感覺,如果是NVME硬碟,可能感覺不到。一,註冊表導入桌面新建一個文字文檔,複製貼上如下內容,另存為1.reg,然後右鍵合併,並重新啟動電腦。 WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement]"DisablePagingExecutive"=d

最近,小米發布了一款功能強大的高階智慧型手機小米14Pro,它不僅外觀設計時尚,而且擁有內在和外在的黑科技。這款手機擁有頂級的性能和出色的多工處理能力,讓用戶能夠享受快速且流暢的手機使用體驗。但效能也是會收到記憶體的影響的,很多用戶想要知道小米14Pro如何查看記憶體佔用,趕快來看看吧。小米14Pro如何查看記憶體佔用?小米14Pro查看記憶體佔用方法介紹開啟小米14Pro手機【設定】中的【應用程式管理】按鈕。查看已安裝的所有應用程式列表,瀏覽列表並找到你想查看的應用,點擊它進入應用程式詳細頁面。在應用程式詳細頁面中

新手用戶在購買電腦時,會好奇電腦記憶體8g和16g有什麼差別?應該選擇8g還是16g呢?針對這個問題,今天小編就來跟大家詳細說明一下。 電腦記憶體8g和16g的差別大嗎? 1、在一般家庭或是普通工作使用,8G運行記憶體可以滿足,因此在使用過程中8g和16g區別不大。 2、遊戲愛好者使用時候,目前大型遊戲基本上是6g起步,8g是最低標準。目前在螢幕是2k的情況下,更高解析度並不會帶來更高的幀數表現,因此對8g和16g也無較大差異。 3、對於音訊、視訊剪輯使用者來說,8g和16g會出現明顯區

本站9月3日消息,韓媒etnews當地時間昨報道稱,三星電子和SK海力士的「類HBM式」堆疊結構行動記憶體產品將在2026年後實現商業化。消息人士表示這兩大韓國記憶體巨頭將堆疊式行動記憶體視為未來重要收入來源,並計劃將「類HBM記憶體」擴展到智慧型手機、平板電腦和筆記型電腦中,為端側AI提供動力。綜合本站先前報導,三星電子的此類產品叫做LPWideI/O內存,SK海力士則將這方面技術稱為VFO。兩家企業使用了大致相同的技術路線,即將扇出封裝和垂直通道結合在一起。三星電子的LPWideI/O內存位寬達512

報告稱,三星電子的高層DaeWooKim表示,在2024年韓國微電子和封裝學會年會上,三星電子將完成採用16層混合鍵結HBM記憶體技術的驗證。據悉,這項技術已通過技術驗證。報告也稱,此次技術驗證將為未來若干年內的記憶體市場發展奠定基礎。 DaeWooKim表示,三星電子成功製造了基於混合鍵合技術的16層堆疊HBM3內存,該內存樣品工作正常,未來16層堆疊混合鍵合技術將用於HBM4內存量產。 ▲圖源TheElec,下同相較現有鍵合工藝,混合鍵結無需在DRAM記憶體層間添加凸塊,而是將上下兩層直接銅對銅連接,

本站3月21日消息,美光在發布季度財報後舉行了電話會議。在該會議上美光CEO桑傑・梅赫羅特拉(SanjayMehrotra)表示,相對於傳統內存,HBM對晶圓量的消耗明顯更高。美光錶示,在同一節點生產同等容量的情況下,目前最先進的HBM3E內存對晶圓量的消耗是標準DDR5的三倍,並且預計隨著性能的提升和封裝複雜度的加劇,在未來的HBM4上這一比值將進一步提升。參考本站以往報道,這一高比值有相當一部分原因在HBM的低良率上。 HBM記憶體採用多層DRAM記憶體TSV連線堆疊而成,一層出現問題就意味著整個

本站5月6日消息,雷克沙Lexar推出Ares戰神之翼系列DDR57600CL36超頻內存,16GBx2套條5月7日0點開啟50元定金預售,至手價1299元。雷克沙戰神之翼記憶體採用海力士A-die記憶體顆粒,支援英特爾XMP3.0,提供以下兩個超頻預設:7600MT/s:CL36-46-46-961.4V8000MT/s:CL38-48-49 -1001.45V散熱方面,此內存套裝搭載1.8mm厚度的全鋁散熱馬甲,配備PMIC專屬導熱矽脂墊。記憶體採用8顆高亮LED燈珠,支援13種RGB燈光模式,可

如果您已經安裝了新的RAM,但它沒有顯示在您的Windows電腦上,本文將幫助您解決此問題。通常,我們會透過升級RAM來提高系統的效能。然而,系統效能也取決於其他硬件,如CPU、SSD等。升級RAM也可以提升您的遊戲體驗。有些使用者註意到安裝的內存在Windows11/10中沒有顯示。如果您遇到這種情況,您可以使用此處提供的建議。已安裝的記憶體未顯示在Windows11上如果您的Windows11/10PC上沒有顯示已安裝的RAM,以下建議將對您有所幫助。安裝的記憶體是否與您的電腦主機板相容?在BIO
