Spring Framework 6.1 中的 CDS

工程 | Sébastien Deleuze | 2023 年 12 月 4 日 | ...

作為對使用 Spring 提升執行時效率這篇部落格文章的跟進,我很高興地分享,我們對 Project Leyden 最佳化方案的探索帶來了一些有趣的發現,關於 JDK 中鮮為人使用的 CDS(“類資料共享”)特性,並且它已成為我們已整合到 Spring Framework 6.1 中釋出的一個新特性。

正如官方文件中所述,類資料共享 (CDS) 透過將類元資料快取到存檔檔案中來幫助減少 JVM 的啟動時間和記憶體佔用,以便可以快速預載入到新啟動的 JVM 中。這加速了類載入,這是影響啟動時間的一個重要因素。大多數最新的 JDK 發行版都預打包了一個預設的 CDS 存檔,用於包含常見 JDK 類的元資料。您還可以建立自定義的 CDS 存檔,以加快您自己應用程式中類的載入速度。

GraalVM native imageProject CRaC 都允許 Spring Boot 應用程式在幾十毫秒內啟動。那麼我們為什麼要關注 CDS 呢?我認為有三個主要原因值得關注

  • 它是一項成熟且生產就緒的技術,位於 OpenJDK 主線中,顯著地更易於使用,因為它帶來的限制和副作用比 GraalVM 和 Project CRaC 更少。
  • 正如 Brian Goetz 在他在 Devoxx 大會上的 Project Leyden 演講中所說:“今天大多數人不用 CDS,但可能應該用,因為只需相對較少的工作就能獲得合理的啟動改進”。
  • 這項技術在每個新的 JVM 版本中都變得越來越好,Project Leyden 的目標是在不久的將來增加更多好處。

讓我們來了解 CDS 能為您的 Spring 應用程式帶來什麼!

Spring Framework 6.1 中引入的初始 CDS 支援

Spring Framework 6.1 帶來了新的類資料共享文件章節,解釋了最佳化應用程式的兩個步驟過程

  1. 透過訓練執行建立 CDS 存檔是可能的,這得益於新的 -Dspring.context.exit=onRefresh JVM 系統屬性,對於大多數用例,這不需要啟動 bean 或訪問遠端服務。
  2. 使用存檔以最佳化生產環境的啟動。

為了使 CDS 最佳化完全有效,您必須確保建立存檔和啟動應用程式的命令所使用的 JDK 和 classpath 是相同的。另請注意,為了有效地快取類,

  • classpath 應指定為一個包含常規非巢狀 JAR 的列表。
  • 避免使用目錄。
  • 避免 * 萬用字元擴充套件。

由於 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 快取載入的。

Spring Petclinic 的 CDS 資料點

讓我們看看能從部署了這些 CDS 最佳化的著名 Spring Petclinic 應用程式(執行在 Java 21 上,並可選擇地與 Spring AOT 最佳化結合使用)的資料點中學到什麼。

Executable JAR, Unpacked, CDS and CDS + 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 開發者和運維人員的限制。

祝好!

訂閱 Spring 通訊

透過 Spring 通訊保持聯絡

訂閱

先行一步

VMware 提供培訓和認證,助您快速提升。

瞭解更多

獲取支援

Tanzu Spring 透過一次簡單的訂閱,為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群中的所有近期活動。

檢視全部