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 はまだ公開されていません。

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

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