JDK25 JEP 483: Ahead-of-Time Command-Line Ergonomics

blog1.mammb.com


JDK 24 の JEP 483: Ahead-of-Time Class Loading & Linking

JDK 24 の JEP 483: Ahead-of-Time Class Loading & Linking により、JVMが通常ジャスト・イン・タイムで行うはずの読み取り、解析、ロード、リンク作業を先行して行うことで、アプリケーションの起動時間を短縮することができるようになりました。

https://blog1.mammb.com/entry/2025/04/16/185846

JDK 24では、AOTキャッシュを利用するには、以下の2つのステップが必要です。

  • record モードを指定し、アプリケーションのトレーニング実行のダイナミクスを観察し、AOT設定に記録
  • create モードを指定し、トレーニング実行中に記録されたコンフィギュレーションに基づいてAOTキャッシュを作成

この2段階のワークフローは以下のように実行されます。

$ java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf \
       -cp app.jar com.example.App ...

$ java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf \
       -XX:AOTCache=app.aot

その後、AOTキャッシュを指定してアプリケーションを実行します。

$ java -XX:AOTCache=app.aot -cp app.jar com.example.App ...

JEP 514: Ahead-of-Time Command-Line Ergonomics では、これらの AOTキャッシュ操作を簡略化します。


JDK 25 の Ahead-of-Time Command-Line Ergonomics

AOTキャッシュ出力ファイルを指定する新しいコマンドライン・オプション AOTCacheOutput が追加されました。

このオプションを指定することで、トレーニングの実行(AOTMode=record)とAOTキャッシュの作成(AOTMode=create)を1ステップで実行できます(AOTConfigurationファイルはコマンド終了時に削除されます)。

$ java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...

AOTキャッシュを使用した実行は変更ありません。

$ java -XX:AOTCache=app.aot -cp app.jar com.example.App ...


環境変数 JDK_AOT_VM_OPTIONS が合わせて追加されました。

この環境変数は JAVA_TOOL_OPTIONS 環境変数と同じように使え、キャッシュ作成(AOTMode=create)にのみ適用されます。JDK_AOT_VM_OPTIONSを利用することでコマンドラインオプションの違いにより2つのステップが必要と思われる使用例でも、1ステップのワークフローとして実行することができます。

なお、従来通り、トレーニングの実行(AOTMode=record)とAOTキャッシュの作成(AOTMode=create)を別ステップで行うこともできます。これは、例えば、クラウドの小さなインスタンスにアプリケーションをデプロイする場合、小さなインスタンスでトレーニングの実行を行い、大きなインスタンスでAOTキャッシュを作成するなどの用途で有用でしょう(トレーニングの実行はデプロイ環境を反映するが、AOTキャッシュの作成は大規模インスタンスの追加CPUコアとメモリを活用することができる)。