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.create-appcds 設定プロパティを true に設定するだけで、簡単にAppCDSを生成できます。Mavenを使用したQuarkusアプリケーションの例( /tmp/code-with-quarkus にあると仮定)では、次のようにアプリケーションをビルドするだけで、AppCDSアーカイブが生成されます。

./mvnw package -Dquarkus.package.create-appcds=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)をターゲットにしていることを確認してください。

コンテナでの使用

quarkus-container-image-jib エクステンションを使用してコンテナイメージをビルドする場合、アーカイブを生成し、コンテナ内で実行時に使用できるようにするために必要なすべての手順は、Quarkus によって自動的に処理されます。

このように、 quarkus.package.create-appcdstrue に設定するだけで、生成されたコンテナは起動時間とメモリ使用量のわずかな削減の恩恵を受けることができます。

関連コンテンツ