The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.
このページを編集

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機能を無効にします。

アーカイブが使えなくなったときに、単に実行を停止させたい場合は、以下のようなコマンドラインでの起動が利用可能です。

java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar quarkus-run.jar

アーカイブをビルドするためにアプリケーションを起動する必要があることは前述しましたが、Quarkusはこの状況にどのように対処するのかという疑問が生じます。

その答えは、アプリケーションのビルド時に、アプリケーションアーカイブがビルドされた直後に、Quarkusによってアプリケーションが起動されますが、起動プロセスのうち安全な部分のみが実行されます。具体的には、実際にソケットを開いたり、アプリケーションロジックを実行したりするステップまで、アプリケーションが実行されます。

この結果、アーカイブ生成プロセスは、一方では完全に安全ですが、他方では、アプリケーションが起動時に必要となるかもしれないありとあらゆるクラスをアーカイブすることはできません。その結果、ユーザーは手動でAppCDSアーカイブを生成することで、わずかに効果的なアーカイブを取得することが期待できます。

AppCDSは、最新のJDKリリースで大幅に改善されました。つまり、AppCDSから可能な限り最高の改善を得るためには、プロジェクトが可能な限り高いJavaバージョン(理想的には17または21)をターゲットにしていることを確認してください。

JDK 24から、JVMはAOTキャッシュの形でクラス・データ共有の進化を提供します。 JDK 24+をターゲットとするアプリケーションをビルドしている場合、アプリケーションをパッケージ化する際に以下のシステム・プロパティを追加することで、この機能を利用することができます:

-Dquarkus.package.jar.appcds.use-aot=true

このフラグ(とオリジナルのフラグ -Dquarkus.package.jar.appcds.enabled=true )の結果、 app.aot という名前のAOTキャッシュファイルが作成されます。

このAOTキャッシュは、アプリケーションの起動時に次のように使用できます:

cd target/quarkus-app
java -XX:AOTCache=app.aot -jar quarkus-run.jar

コンテナでの使用

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.enabledtrue に設定するだけで、生成されたイメージを使用するコンテナは、起動時間とメモリ使用量のわずかな削減の恩恵を受けることができます。

Quarkusでは、AppCDSアーカイブを生成するためにコンテナが起動します。 これは、ビルドの Java バージョンと生成されるコンテナイメージの Java バージョンを一致させるためです。 quarkus.package.jar.appcds.use-containerfalse に設定することで、これをオプトアウトできます。 その場合、Quarkus アプリケーションを実行する Java バージョンが、それをビルドするマシンのバージョンと一致するようにするのはユーザーの責任です。

関連コンテンツ