JVM AOT 快取
即時編譯 (AOT) 快取是 Java 24 透過 JEP 483 引入的一項 JVM 功能,可以幫助減少 Java 應用程式的啟動時間和記憶體佔用。AOT 快取是 類資料共享 (CDS) 的自然演進。Spring Framework 支援 CDS 和 AOT 快取,如果您的 JVM 版本(Java 24+)可用,建議使用後者。
要使用此功能,應為應用程式的特定類路徑建立 AOT 快取。可以在已部署的例項上建立此快取,或者在訓練執行期間建立,例如在打包應用程式時,Spring Framework 提供了鉤子點以方便此類用例。一旦快取可用,使用者應透過 JVM 標誌選擇使用它。
| 如果您使用 Spring Boot,強烈建議利用其可執行 JAR 解壓支援,該支援旨在滿足 AOT 快取和 CDS 的類載入要求。 |
建立快取
AOT 快取通常可以在應用程式退出時建立。Spring Framework 提供了一種操作模式,在此模式下,一旦 ApplicationContext 完成重新整理,程序即可自動退出。在此模式下,所有非惰性初始化的單例都已例項化,並且 InitializingBean#afterPropertiesSet 回撥已呼叫;但生命週期尚未開始,並且 ContextRefreshedEvent 尚未釋出。
要在訓練執行期間建立快取,可以指定 -Dspring.context.exit=onRefresh JVM 標誌,以便在 ApplicationContext 重新整理後啟動並退出您的 Spring 應用程式。
-
AOT 快取
-
CDS
# Both commands need to be run with the same classpath
java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -Dspring.context.exit=onRefresh ...
java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aot ...
# To create a CDS archive, your JDK/JRE must have a base image
java -XX:ArchiveClassesAtExit=app.jsa -Dspring.context.exit=onRefresh ...
使用快取
建立快取檔案後,您可以使用它來更快地啟動應用程式。
-
AOT 快取
-
CDS
# With the same classpath (or a superset) tan the training run
java -XX:AOTCache=app.aot ...
# With the same classpath (or a superset) tan the training run
java -XX:SharedArchiveFile=app.jsa ...
注意日誌和啟動時間,以檢查 AOT 快取是否成功使用。要了解快取的有效性,您可以透過新增一個額外屬性來啟用類載入日誌:-Xlog:class+load:file=aot-cache.log。這將建立一個 aot-cache.log 檔案,其中包含每次嘗試載入類及其源的記錄。從快取載入的類應具有“共享物件檔案”源,如以下示例所示:
[0.151s][info][class,load] org.springframework.core.env.EnvironmentCapable source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.BeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.ListableBeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.HierarchicalBeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.context.MessageSource source: shared objects file
如果 AOT 快取無法啟用,或者您有大量未從快取載入的類,請確保在建立和使用快取時滿足以下條件:
-
必須使用完全相同的 JVM。
-
類路徑必須指定為 JAR 或 JAR 列表,並避免使用目錄和
*萬用字元。 -
JAR 的時間戳必須保留。
-
使用快取時,類路徑必須與建立快取時使用的類路徑相同,並且順序相同。可以在末尾指定額外的 JAR 或目錄(但不會被快取)。