GraalVMとは?
GraalVMは、Javaアプリケーションを事前にスタンドアロンバイナリにコンパイルするため、インスタント起動、ウォームアップなしのピークパフォーマンス、リソースの削減を実現します。
GraalVMの主な利点は次のとおりです。
- リソース使用量の削減:GraalVMによって事前にコンパイルされたJavaアプリケーションは、実行に必要なメモリとCPUが少なくなります。Just-in-TimeコンパイルにはメモリやCPUサイクルが消費されません。その結果、アプリケーションの実行に必要なリソースが削減され、大規模な運用コストが低減されます。
- 高速な起動:GraalVMを使用すると、実行時ではなくビルド時にアプリケーションの一部要素を初期化することで、Javaアプリケーションの起動速度を向上させ、ウォームアップなしで予測可能なピークパフォーマンスをすぐに達成できます。
- コンパクトなパッケージング:GraalVMによって事前にコンパイルされたJavaアプリケーションはサイズが小さく、軽量なコンテナイメージに簡単にパッケージ化して、迅速かつ効率的なデプロイが可能です。
- セキュリティの向上:GraalVMは、到達不可能なコード(未使用のクラス、メソッド、フィールド)、Just-in-Timeコンパイルインフラストラクチャ、ビルド時初期化コードをバイナリから除外することで、Javaアプリケーションの攻撃対象領域を削減します。GraalVMのクローズドワールド仮定により、リフレクション、シリアル化などの動的機能をランタイムで無効化し、ビルド時にそのようなクラス、メソッド、フィールドの明示的なインクルードリストを要求することで、アプリケーションが未知のコードを読み込むことを防ぎます。GraalVMは、ソフトウェア部品表(SBOM)をバイナリに埋め込むことができ、一般的なセキュリティスキャナーを使用して、公開されているCVE(Common Vulnerabilities and Exposures)についてJavaアプリケーションバイナリをチェックしやすくなります。
- クラウドネイティブマイクロサービスの容易な構築:Spring Boot、Micronaut、Helidon、Quarkusなどの一般的なマイクロサービスフレームワークと、Oracle Cloud Infrastructure(OCI)、Amazon Web Services(AWS)、Google Cloud Platform(GCP)、Microsoft AzureなどのクラウドプラットフォームはすべてGraalVMをサポートしています。これにより、バイナリとしてコンパイルされ、小さなコンテナにパッケージ化され、OCI、AWS、GCP、Azureなどのクラウドプラットフォームで実行されるクラウドネイティブJavaマイクロサービスを簡単に構築できます。
- Pythonなどの言語によるJavaアプリケーションの拡張:GraalVMを使用すると、Python、JavaScriptなどの言語を組み込んでJavaアプリケーションを拡張できます。
- 既存の開発および監視ツールの使用:既存のJavaアプリケーション開発および監視ツールは、GraalVMアプリケーションバイナリと連携します。GraalVMは、MavenとGradleのビルドプラグイン、CI/CD用のGitHub Actionsを提供します。GraalVMは、Java Flight Recorder(JFR)、Java Management Extensions(JMX)、ヒープダンプ、VisualVM、その他の監視ツールをサポートしています。GraalVMは、既存のJavaエディター/IDEやJUnitなどの単体テストフレームワークと連携します。
GraalVM JDKでJavaを高速に実行
GraalVMは、新しい高度なJust-in-Timeコンパイラ(Graal)を使用してJavaアプリケーションの実行速度を向上させることができるフルスケールのJDKディストリビューションです。プラットフォームとしてはJava HotSpot VMを使用しているため、OpenJDKで動作するすべてのツールとライブラリは、GraalVM JDKでも同じように動作します。このコンテキストでは、GraalVMはJVMの最終層最適化コンパイラ(C2)をGraalコンパイラに置き換えます。このコンパイラは、Oracle Labsでの10年以上の研究成果であり、高度なインライン化、部分エスケープ分析、コード複製、投機的最適化などのいくつかの新しい最適化が含まれています。GraalVM自体はJavaで記述されており、C/C++ではなく、保守が容易になり、新しい最適化の開発と提供がはるかに高速になります。
Oracle Cloud、Twitter、Facebookなどのいくつかの企業は、パフォーマンスの向上、リソース使用量の削減、デプロイコストの削減のために、GraalVM JDKで大規模なJavaアプリケーションを実行しています。GraalVM JDKは、他のJDKのドロップイン置換として簡単に使用できます—開始方法はこちら。
Javaアプリケーションのネイティブ実行ファイルのビルド
JVMでアプリケーションを実行すると、起動コストとフットプリントコストが発生する可能性があります。GraalVMには、Graalコンパイラを利用してJavaアプリケーションのネイティブ実行ファイルを生成するテクノロジーであるNative Imageが含まれています。これは自己完結型であり、JVMは不要になります。イメージ生成プロセスでは、静的分析を使用してメインJavaメソッドから到達可能なすべてのコードを見つけ、完全な事前コンパイル(AOT)を実行します。ビルド時にスナップショットも実行されるため、ランタイム時にアプリケーションが事前に設定されたヒープで高速に起動します。生成されたネイティブバイナリには、起動時にすぐに実行できるマシンコード形式のプログラム全体が含まれています。このようなネイティブ実行ファイルには、次の機能があります。
- ビルド時にJDKとユーザーコードを事前に初期化するため、インスタント起動が可能
- コード実行オーバーヘッドの最小化により、メモリとCPUの使用量が削減される
- AOTアプローチとスリムなランタイムコンポーネントによる小型パッケージ化
- コードの削除とAOTアプローチによる攻撃対象領域の縮小
最初のアプリケーションをビルドすることで、Native Imageを試してみてください。
最新の業界ツールとプラットフォームとの連携
Native Imageは、マイクロサービスとサーバーレスJavaアプリケーションに最適なデプロイモデルです。Spring Boot、Micronaut、Quarkus、Helidonなどの主要なアプリケーションフレームワークがNative Imageをサポートしているのはそのためです。すぐにNative Imageで使用できるライブラリ、フレームワーク、ツールのエコシステム全体があります—リストはこちら。
主要なクラウドプラットフォームもすべて、GraalVM Native Imageを使用したアプリケーションの構築をサポートしています。Oracle Cloud InfrastructureでGraalVMを使用してアプリケーションを簡単に構築し(サブスクリプションの一部としてOracle GraalVMにアクセスできます)、Azure SDK for JavaおよびSpring Cloud AzureのGraalVMサポートを活用し、AWS SDK for JavaでNative Imageを使用し、Google CloudのJava用クライアントライブラリを使用してアプリケーションをネイティブ実行ファイルとしてコンパイルできます。
GraalVMがクラウドJavaデプロイメントをどのように改善できるかの例として、Disney Streamingのユースケースをご覧ください。サーバーレスJavaワークロードの起動の遅延を軽減する方法を調査していたところ、JVMで起動に3.6秒かかった関数が、GraalVM Native Imageでコンパイルすると100ミリ秒未満で起動することがわかりました—36倍の高速化です!512MBなどの最小メモリ内で動作する場合でも、ネイティブにコンパイルされたアプリケーションは完全に機能し、JVMよりもはるかに高速に起動しました。
JavaScript、Python、その他の言語によるJavaの拡張
GraalVMを使用すると、JavaアプリケーションのコンテキストでJavaScript、Python、Ruby、WebAssembly、その他の言語を実行できます。これは、細かいホストアクセスのフィルターを使用して、これらの言語にJavaデータ構造を公開する機能を提供します。開始するには、最初のポリグロットJavaアプリケーションをビルドする方法、ゲスト言語関数をJava値として定義する方法、およびJavaからゲスト言語にアクセスする方法を参照してください。
GraalVMとTruffleフレームワークを、言語やツールのプラットフォームとしても使用できます。これにより、言語インタープリターから自動的に高性能なコードが生成され、豊富なツールエコシステムにアクセスできます。独自の言語またはツールの実装方法をご覧ください。