先行一步
VMware 提供培訓和認證,助您快速提升。
瞭解更多作為對使用 Spring 提升執行時效率這篇部落格文章的跟進,我很高興地分享,我們對 Project Leyden 最佳化方案的探索帶來了一些有趣的發現,關於 JDK 中鮮為人使用的 CDS(“類資料共享”)特性,並且它已成為我們已整合到 Spring Framework 6.1 中釋出的一個新特性。
正如官方文件中所述,類資料共享 (CDS) 透過將類元資料快取到存檔檔案中來幫助減少 JVM 的啟動時間和記憶體佔用,以便可以快速預載入到新啟動的 JVM 中。這加速了類載入,這是影響啟動時間的一個重要因素。大多數最新的 JDK 發行版都預打包了一個預設的 CDS 存檔,用於包含常見 JDK 類的元資料。您還可以建立自定義的 CDS 存檔,以加快您自己應用程式中類的載入速度。
既GraalVM native image 也Project CRaC 都允許 Spring Boot 應用程式在幾十毫秒內啟動。那麼我們為什麼要關注 CDS 呢?我認為有三個主要原因值得關注
讓我們來了解 CDS 能為您的 Spring 應用程式帶來什麼!
Spring Framework 6.1 帶來了新的類資料共享文件章節,解釋了最佳化應用程式的兩個步驟過程
-Dspring.context.exit=onRefresh
JVM 系統屬性,對於大多數用例,這不需要啟動 bean 或訪問遠端服務。為了使 CDS 最佳化完全有效,您必須確保建立存檔和啟動應用程式的命令所使用的 JDK 和 classpath 是相同的。另請注意,為了有效地快取類,
*
萬用字元擴充套件。由於 Spring Boot 可執行 JAR 或文件中提及的解壓部署目前尚未滿足所有這些條件,因此尚未實現最佳的 CDS 效能。
這就是為什麼,在不對Spring Boot 未來如何更整合地支援 CDS 做出任何假設的前提下,我們一直與 Stéphane Nicoll 合作研究一種對 CDS 更友好的解壓部署方式,以便獲取相關資料點,併為 Spring 開發者提供探索 CDS 支援的途徑。更多詳情請參見相關的 spring-boot#38276 issue。
如果您想在您的應用程式上使用 CDS 並提供反饋,您可以嘗試並借鑑 spring-cds-demo 倉庫,其中包含一個自給自足的 unpack-executable-jar.sh 指令碼,該指令碼以允許最佳 CDS 效能的方式解壓 Spring Boot 可執行 JAR。您還可以嘗試 Stéphane 建立的優秀 cds-log-parser 工具,以生成報告,指示哪些類是從 CDS 快取載入的。
讓我們看看能從部署了這些 CDS 最佳化的著名 Spring Petclinic 應用程式(執行在 Java 21 上,並可選擇地與 Spring AOT 最佳化結合使用)的資料點中學到什麼。
第一個要點與 CDS 無關,並且已經是眾所周知並有文件說明的,但值得強調的是:為了獲得最佳啟動時間,Spring Boot 應用程式的生產部署應該解壓。如果您使用 Buildpacks,情況已經是這樣了。如果不是,您可能需要檢查並可能改進您的自定義部署。
CDS 最佳化可以將啟動時間減少 30% 到 35%,與解壓部署相比,只需進行少量限制,即建立一個幾十 MB 的 CDS 存檔並將其與應用程式一起分發。當然,與 GraalVM 或 Project CRaC 相比,收益沒有那麼顯著,但您也無需做大量工作即可獲得此好處。因此,如果得到適當整合,CDS 可能具有廣泛應用的巨大潛力。如果您將 CDS 與 Spring AOT 最佳化相結合,您可以將 Petclinic 的啟動時間減少 36% 到 42%。
一如既往地,我們期待 Spring 社群的反饋,以便我們思考如何實現更整合的體驗的潛在下一步措施。例如,您是否有興趣自動構建帶有 CDS 快取的 Spring Boot 最佳化容器?
展望未來,Spring 團隊將繼續與 Java 平臺團隊合作,探討如何結合Project Leyden premain 最佳化來利用這些改進和發現,以突破 JVM 執行時效率的極限,同時儘可能減少對 Spring 開發者和運維人員的限制。
祝好!