JVM AOT キャッシュ

AOT キャッシュは、JEP 483 (英語) を経て Java 24 で導入された JVM 機能であり、Java アプリケーションの起動時間とメモリ使用量を削減できます。AOT キャッシュはクラスデータの共有 (CDS) [Oracle] の自然な進化形です。Spring Framework は CDS キャッシュと AOT キャッシュの両方をサポートしていますが、使用している JVM バージョン(Java 24+)で利用可能な場合は後者を使用することをお勧めします。

この機能を使用するには、アプリケーションの特定のクラスパスに対して AOT キャッシュを作成する必要があります。このキャッシュは、デプロイ済みのインスタンス上、またはアプリケーションのパッケージ化時などに実行されるトレーニング実行中に作成できます。これは、Spring Framework が提供するフックポイントによって、このようなユースケースを容易にするものです。キャッシュが利用可能になったら、ユーザーは JVM フラグを介してキャッシュの使用をオプトインする必要があります。

Spring Boot を使用している場合は、AOT キャッシュと CDS の両方のクラスローディング要件を満たすように設計された実行可能 JAR 解凍サポートを活用することを強くお勧めします。

キャッシュの作成

AOT キャッシュは通常、アプリケーションの終了時に作成されます。Spring Framework は、ApplicationContext のリフレッシュ後にプロセスを自動的に終了する動作モードを提供します。このモードでは、遅延初期化されていないすべてのシングルトンがインスタンス化され、InitializingBean#afterPropertiesSet コールバックが呼び出されていますが、ライフサイクルは開始されておらず、ContextRefreshedEvent はまだ公開されていません。

トレーニング実行中にキャッシュを作成するには、-Dspring.context.exit=onRefresh JVM フラグを指定して、ApplicationContext がリフレッシュされたら Spring アプリケーションを起動して終了することができます。

  • AOT キャッシュ (Java 25+)

  • AOT キャッシュ (Java 24)

  • CDS

java -XX:AOTCacheOutput=app.aot -Dspring.context.exit=onRefresh -jar application.jar ...
# 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 ...
Java 25+ では、AOT キャッシュにはメソッドプロファイリング情報 (英語) などが格納されます。そのため、この機能を活用するには、アプリケーションの起動のみを最適化するように設計された -Dspring.context.exit=onRefresh フラグを使用するのではなく、本番環境に近いワークフローの一部を経験したアプリケーションに対して AOT キャッシュを作成することをお勧めします。

キャッシュの使用

キャッシュファイルが作成されると、それを使用してアプリケーションをより速く起動できるようになります。

  • 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 ファイルまたはディレクトリは末尾に指定できます(ただし、キャッシュされません)。