AppCDS
このリファレンスガイドでは、Quarkusアプリケーションでアプリケーションクラスデータ共有(AppCDS)を有効にする方法について説明します。
アプリケーションクラスデータ共有(AppCDS)とは?
アプリケーション・クラス・データ共有 は 、JVMアプリケーションのスタートアップ時間とメモリ・フットプリントを削減するのに役立つJVM機能です。これは、JVMがスタートアップ時にロードされるクラスの事前処理された共有アーカイブを作成することによって達成されます。これらのクラスは、アプリケーションが起動するたびにロードされるので、AppCDSは、アプリケーション自体が特定の方法でコード化または構成される必要がなく、アプリケーションの起動時間を改善するコンセプト上、シンプルな方法です。どの程度改善されるかは、ロードされるクラスの数、基盤となるハードウェアなど、多くの要因に依存します。
バニラAppCDSの生成
アプリケーション用にAppCDSを手動で作成する主な欠点は、その生成が、アプリケーションを本番にデプロイする前の段階で、特別なフラグでアプリケーションを起動し、アーカイブを取得する必要があることです。
| 新しいJVMが段階的にプロセスを容易にしているため、正確なプロセスは使用するJVMのバージョンに依存します。 |
この事実は、CIパイプラインがアプリケーションのビルドとデプロイを担当する実世界のデプロイメントにAppCDSを使用することを困難にしています。
QuarkusにおけるAppCDS
アーカイブの作成
Quarkusでは、 quarkus.package.jar.appcds.enabled 設定プロパティを true に設定するだけで、AppCDSを簡単に生成できます。
例えば、Mavenを使用するQuarkusアプリケーション( /tmp/code-with-quarkus にあると仮定)では、次のようにアプリケーションをビルドするだけで、AppCDSアーカイブを生成できます:
./mvnw package -Dquarkus.package.jar.appcds.enabled=true
ビルドが完了すると、出力には(他にも多数ありますが特に)次のようなものが含まれます。
[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] Launching AppCDS creation process.
[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] AppCDS successfully created at: '/tmp/code-with-quarkus/target/quarkus-app/app-cds.jsa'.
[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] To ensure they are loaded properly, run the application jar from its directory and also add the '-XX:SharedArchiveFile=app-cds.jsa' JVM flag.
Moreover, make sure to use the exact same Java version (x.y.z) to run the application as was used to build it.
/tmp/code-with-quarkus/target/quarkus-app を見てみると、他も多数ファイルがありますが、生成された AppCDS アーカイブである app-cds.jsa があります。
アーカイブの利用
アーカイブの使用は、 -XX:SharedArchiveFile フラグを使用することで可能です。ただし、いくつかの注意事項があります。
-
QuarkusのjarファイルとAppCDSアーカイブのパスは、Quarkusがアーカイブをビルドする際に使用したパスと完全に同じである必要があります。
-
アプリケーションの実行に使用するJVMのバージョンは、Quarkusアプリケーションのビルドに使用したものと 完全に 同じである必要があります。
アプリケーションの実行に、アプリケーションのビルドに使用したのと同じJVMを使用すると仮定すると、次のようにアプリケーションを起動することができます。
cd target/quarkus-app
java -XX:SharedArchiveFile=app-cds.jsa -jar quarkus-run.jar
|
JVMは弾力的です。アーカイブ・ファイルが(何らかの理由で)使用できない状況に直面すると、単にAppCDS機能を無効にします。 アーカイブが使えなくなったときに、単に実行を停止させたい場合は、以下のようなコマンドラインでの起動が利用可能です。
|
|
アーカイブをビルドするためにアプリケーションを起動する必要があることは前述しましたが、Quarkusはこの状況にどのように対処するのかという疑問が生じます。 その答えは、アプリケーションのビルド時に、アプリケーションアーカイブがビルドされた直後に、Quarkusによってアプリケーションが起動されますが、起動プロセスのうち安全な部分のみが実行されます。具体的には、実際にソケットを開いたり、アプリケーションロジックを実行したりするステップまで、アプリケーションが実行されます。 この結果、アーカイブ生成プロセスは、一方では完全に安全ですが、他方では、アプリケーションが起動時に必要となるかもしれないありとあらゆるクラスをアーカイブすることはできません。その結果、ユーザーは手動でAppCDSアーカイブを生成することで、わずかに効果的なアーカイブを取得することが期待できます。 |
|
AppCDSは、最新のJDKリリースで大幅に改善されました。つまり、AppCDSから可能な限り最高の改善を得るためには、プロジェクトが可能な限り高いJavaバージョン(理想的には17または21)をターゲットにしていることを確認してください。 |
|
Starting with JDK 24, the JVM provides an evolution of the class-data sharing in the form of the AOT cache. If you are building an application that will target JDK 25+ you can take advantage of this feature by adding the following system property when packaging your application:
The result of using these flags is the creation of an AOT cache file named このAOTキャッシュは、アプリケーションの起動時に次のように使用できます:
|
Generate the AOT cache from integration tests
Although Quarkus can generate an AOT cache file without ever running the production application, the file will not be optimal as the application was never exercised against any load. To alleviate this,
Quarkus can use the existing testsuite of tests annotated with @QuarkusIntegrationTest to create an AOT cache file.
See the corresponding section in the Testing Guide for more details.
コンテナでの使用
When building container images using the quarkus-container-image-jib extension, Quarkus automatically takes care of all the steps needed to generate the archive and make it usable at runtime in the container.
このように、 quarkus.package.jar.appcds.enabled を true に設定するだけで、生成されたイメージを使用するコンテナは、起動時間とメモリ使用量のわずかな削減の恩恵を受けることができます。
Quarkusでは、AppCDSアーカイブを生成するためにコンテナが起動します。
これは、ビルドの Java バージョンと生成されるコンテナイメージの Java バージョンを一致させるためです。
quarkus.package.jar.appcds.use-container を false に設定することで、これをオプトアウトできます。
その場合、Quarkus アプリケーションを実行する Java バージョンが、それをビルドするマシンのバージョンと一致するようにするのはユーザーの責任です。