AppCDS
このリファレンスガイドでは、Quarkusアプリケーションでアプリケーションクラスデータ共有(AppCDS)を有効にする方法について説明します。
アプリケーションクラスデータ共有(AppCDS)とは?
アプリケーション・クラス・データ共有 は 、JVMアプリケーションのスタートアップ時間とメモリ・フットプリントを削減するのに役立つJVM機能です。これは、JVMがスタートアップ時にロードされるクラスの事前処理された共有アーカイブを作成することによって達成されます。これらのクラスは、アプリケーションが起動するたびにロードされるので、AppCDSは、アプリケーション自体が特定の方法でコード化または構成される必要がなく、アプリケーションの起動時間を改善する概念的に単純な方法です。どの程度改善されるかは、ロードされるクラスの数、基盤となるハードウェアなど、多くの要因に依存します。
バニラAppCDSの生成
アプリケーション用にAppCDSを手動で作成する主な欠点は、その生成が、アプリケーションを本番にデプロイする前の段階で、特別なフラグでアプリケーションを起動し、アーカイブを取得する必要があることです。
正確なプロセスは、新しいJVMが段階的にプロセスを容易にしているため、使用するJVMのバージョンに依存します。 |
This fact makes AppCDS difficult to use for real world deployments where a CI pipeline is responsible for building and deploying applications.
QuarkusにおけるAppCDS
アーカイブの作成
Quarkus makes AppCDS generation as simple as setting the quarkus.package.jar.appcds.enabled
configuration property to true
.
For an example Quarkus application using Maven (assuming it is located in /tmp/code-with-quarkus
), the AppCDS archive can be generated by simply building the application like so:
./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)をターゲットにしていることを確認してください。 |
コンテナでの使用
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.
This way, by simply setting quarkus.package.jar.appcds.enabled
to true
, containers using the generated image can benefit from a slight reduction in startup time and memory usage.
You may see that Quarkus starts a container to generate the AppCDS archive.
It does this to ensure that the Java version of the build align with that of the generated container image.
It is possible to opt out of this by setting quarkus.package.jar.appcds.use-container
to false
.
In that case, it is your responsibility to ensure that the Java version that will run the Quarkus application matches that of the machine building it.