CDS
類別資料共用 (CDS) 是一項 JVM 功能,可以協助減少 Java 應用程式的啟動時間和記憶體佔用量。
若要使用此功能,應為應用程式的特定類別路徑建立 CDS 封存檔。Spring 框架提供了一個掛鉤點,以簡化封存檔的建立。一旦封存檔可用,使用者應選擇透過 JVM 旗標來使用它。
建立 CDS 封存檔
應用程式的 CDS 封存檔可以在應用程式結束時建立。Spring 框架提供了一種操作模式,其中在 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
,其中包含每次嘗試載入類別及其來源的記錄。從快取載入的類別應具有「shared objects file」來源,如下列範例所示
[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 或目錄可以在末尾指定 (但不會被快取)。