コンテナ・ファースト
Quarkusアプリケーションは、メモリ使用量が少なく、起動時間が短いように最適化されています。
Quarkus は、当初からコンテナーファーストの理念に基づいて設計されています。具体的には、Quarkus アプリケーションは、以下のようにメモリー使用量が少なく、起動時間が短くなるように最適化されています。
ビルド時処理
Quarkus の中心的なアイデアは、従来のフレームワークが実行時に行うこと、すなわち設定の解析、クラスパスのスキャン、クラスローディングに基づく機能の切り替えなどを、ビルド時に行うことです。
可能な限り多くの処理がビルド時に行われるため、アプリケーションには実行時に使用されるクラスしか含まれません。従来のフレームワークでは、初期アプリケーションのデプロイメントを実行するために必要なすべてのクラスは、一度しか使用されないにもかかわらず、アプリケーションの寿命が尽きるまで放置されます。Quarkus では、これらのクラスはプロダクション JVM にすらロードされません。Quarkus はそこで終わりません。ビルド時の処理中に、アプリケーションで使用されるすべてのコンポーネントの初期化を準備します。これにより、すべてのメタデータ処理がすでに完了しているため、メモリー使用量が少なくなり、起動時間が短縮されます。
リフレクション使用量の削減
Quarkus は可能な限りリフレクションを回避し、起動時間とメモリー使用量を削減します。ビルド時処理中に、エクステンションはアプリケーションコードとクラスパス上の利用可能なクラスを分析し、リフレクション呼び出しを通常の呼び出しに置き換えることができます。また、ビルド時にカスタムプロキシーを生成することで、動的プロキシーの使用も防止されます。
Quarkus が使用する依存性注入フレームワークである Arc は、すべてのリフレクション呼び出しを排除し、ビルド時に注入グラフを推論します。したがって、アプリケーションの起動時に高価なルックアップは不要になります。
GraalVM ネイティブイメージのファーストクラスのサポート
GraalVM ネイティブ実行可能ファイルのサポートは、当初から Quarkus の設計の不可欠な要素でした。アプリケーションがネイティブ実行可能ファイルにコンパイルされると、標準的な JVM よりもはるかに高速に起動し、はるかに小さなヒープで実行できます。ネイティブコンパイラーは、積極的なデッドコード排除技術を使用して、アプリケーションで絶対に必要な JVM およびクラスの部分のみを埋め込みます。Quarkus は、最適化されたネイティブ実行可能ファイルのビルドを簡単にします。ビルド時のアプローチにより、Quarkus はアプリケーションに関する十分なメタデータを収集し、コンパイルを微調整できます。 ` -H:+ReportUnsupportedElementsAtRuntime ` フラグもフォールバックも妥協もありません。
ネイティブイメージのプリブート
Quarkus アプリケーションのネイティブコンパイル中に、可能な限り多くのフレームワークをプリブートします。これは、結果として得られるネイティブ実行可能ファイルが、起動コードのほとんどをすでに実行し、その結果を実行可能ファイルにシリアライズしていることを意味します。これにより、起動がさらに高速になります。
Kubernetes、そしてベアメタル
メモリー使用量を削減し、起動時間を短縮するためのすべての技術は、コンテナーだけでなく、ベアメタルでも有利です。ベアメタルであってもメモリー負荷を軽減でき、アプリケーションの実行を 10 秒も待つ必要がないのは常に快適です。
Quarkus の設計時には、コンテナーだけでなく、Kubernetes などのコンテナーオーケストレーター上への Quarkus アプリケーションのデプロイも考慮しました。Quarkus のビルド時処理は Kubernetes メタデータも生成するため、アプリケーションは Kubernetes にデプロイする準備が整います。ヘルスチェックやメトリクスなどの実行時機能は、すぐに利用できます。Quarkus は、ビルド時に必要なすべてのメタデータを収集し、Kubernetes のデプロイメント記述子を作成してコンテナーイメージを生成します。単一のコマンドラインで、アプリケーションを Kubernetes クラスターにデプロイできます。