CDS

類資料共享 (CDS) 是一個 JVM 特性,可以幫助減少 Java 應用程式的啟動時間和記憶體佔用。

要使用此特性,需要為應用程式的特定類路徑建立一個 CDS 歸檔檔案。Spring Framework 提供了一個鉤子點,以便於建立歸檔檔案。一旦歸檔檔案可用,使用者應透過 JVM 標誌選擇使用它。

建立 CDS 歸檔

可以在應用程式退出時建立應用程式的 CDS 歸檔。Spring Framework 提供了一種操作模式,其中 ApplicationContext 重新整理後進程可以自動退出。在此模式下,所有非延遲初始化的單例都已例項化,並且 InitializingBean#afterPropertiesSet 回撥已被呼叫;但生命週期尚未開始,並且 ContextRefreshedEvent 尚未釋出。

要建立歸檔檔案,必須指定兩個額外的 JVM 標誌

  • -XX:ArchiveClassesAtExit=application.jsa: 在退出時建立 CDS 歸檔

  • -Dspring.context.exit=onRefresh: 啟動 Spring 應用程式,然後按照上述描述立即退出

要建立 CDS 歸檔,您的 JDK/JRE 必須具有基礎映象。如果您在啟動指令碼中新增上述標誌,可能會收到如下所示的警告

-XX:ArchiveClassesAtExit is unsupported when base CDS archive is not loaded. Run with -Xlog:cds for more info.

基礎 CDS 歸檔通常是開箱即用的,但如果需要,也可以透過發出以下命令來建立

$ java -Xshare:dump

使用歸檔

歸檔檔案可用後,將 -XX:SharedArchiveFile=application.jsa 新增到您的啟動指令碼中以使用它,假設工作目錄中存在 application.jsa 檔案。

要檢查 CDS 快取是否有效,您可以使用(僅用於測試,不要在生產環境中使用)-Xshare:on,如果無法啟用 CDS,該標誌將列印錯誤訊息並退出。

要了解快取的有效性,可以透過新增一個額外的屬性來啟用類載入日誌:-Xlog:class+load:file=cds.log。這會建立一個 cds.log 檔案,其中包含每次載入類及其來源的嘗試記錄。從快取載入的類應具有“共享物件檔案”來源,如下例所示

[0.064s][info][class,load] org.springframework.core.env.EnvironmentCapable source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.BeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.ListableBeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.HierarchicalBeanFactory source: shared objects file (top)
[0.065s][info][class,load] org.springframework.context.MessageSource source: shared objects file (top)

如果無法啟用 CDS 或有大量類未從快取載入,請確保在建立和使用歸檔時滿足以下條件

  • 必須使用完全相同的 JVM。

  • 類路徑必須指定為 JAR 檔案列表,避免使用目錄和 * 萬用字元。

  • 必須保留 JAR 檔案的時間戳。

  • 使用歸檔檔案時,類路徑必須與建立歸檔時使用的類路徑相同,且順序一致。可以在末尾指定額外的 JAR 或目錄(但不會被快取)。