使用 Spring Framework 6.1 的 CDS

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

使用 Spring 提高執行效率部落格文章之後,我很高興分享我們對 Project Leyden 優化的探索,導致了一些關於 JDK 鮮少使用的 CDS("Class Data Sharing")功能的有趣發現,並轉化為我們已在 Spring Framework 6.1 中發布的新功能。

官方文件中所述,類別資料共享 (CDS) 藉由將類別中繼資料快取到封存檔案中,有助於減少 JVM 的啟動時間和記憶體佔用量,以便快速預先載入到新啟動的 JVM 中。 這加速了類別載入,這是啟動時間的重要因素。 預設的 CDS 封存檔已預先封裝在最新的 JDK 發行版中,以包含常見 JDK 類別的中繼資料。 您也可以建立自訂 CDS 封存檔,以加速載入您自己的應用程式中的類別。

無論是 GraalVM native image 還是 Project 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 帶來了一個新的 類別資料共享文件區段,解釋了最佳化應用程式的 2 個步驟流程

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

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

  • 類別路徑應指定為常規非巢狀 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 Platform 團隊合作,以了解我們如何利用這些改進和發現與Project Leyden premain 優化,以盡可能減少 Spring 開發人員和運營商的限制,同時盡可能地突破 JVM 上執行時效率方面的界限。

乾杯!

取得 Spring 電子報

訂閱 Spring 電子報,隨時掌握最新資訊

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部