GraalVMは、Javaで記述されたJava開発キット(JDK)です。GraalVMのオープンソース版はOpenJDKをベースとしており、エンタープライズ版はOracle JDKをベースとしています。GraalVMは、ジャストインタイム(JIT)コンパイルに加えて、Javaアプリケーションを事前にコンパイルすることもできます。これにより、初期化の高速化、ランタイムパフォーマンスの向上、リソース消費量の削減が可能になりますが、生成された実行ファイルは、コンパイルされたプラットフォームでのみ実行できます。
追加のプログラミング言語と実行モードを提供します。最初の製品版リリースである GraalVM 19.0 は、2019 年 5 月に配布されました。[ 5 ]最新のリリースは、2025 年 7 月に公開された GraalVM for JDK 24.0.2 です。[ 6 ]
GraalVMと基本JDKの主な違いは以下のとおりです。
GraalVM は、Sun Microsystems Laboratories (現在のOracle Labs ) のMaxine Virtual Machineプロジェクトにルーツがあります。このプロジェクトの目標は、Java 自体で Java 仮想マシンを作成し、C++ での開発に伴う問題、特に手動メモリ管理の問題を回避し、メタ循環最適化の恩恵を受けることでした。プロジェクトは、コンパイラに焦点を移し、可能な限りHotSpotランタイムに組み込むようにしました。GraalVM コンパイラである Graal は、 HotSpotクライアントコンパイラ (「C1」という名前)のコードを手動で Java に変換し、以前の Maxine コンパイラを置き換えることによって開始されました。[ 10 ]
Graal は、実験的な事前コンパイルを提供するために、Java SE 9 から 15 までのOpenJDKなどの HotSpot ベースの JDK リリースに含まれていました。UseJVMCICompilerオプションを使用すると、Graal をサーバー コンパイラ (「C2」という名前) の代替として使用することもできます。[ 11 ]このオプションは、JDK のバージョンとスタンドアロンの GraalVM リリースの両方を維持するという重複した作業をなくすために、Java SE 16 で削除されました。Java アプリケーションからネイティブ実行可能ファイルを作成する同様の機能は、スタンドアロンの GraalVM リリースのツールによって提供されます。このツールは、Java アプリケーションのクラスやその他のメタデータを処理して、特定のオペレーティングシステムとアーキテクチャ用のバイナリを作成します。ネイティブ実行可能ファイルまたはネイティブ共有ライブラリをビルドするために使用できます。native-image
GraalVM は、GraalVM Free Terms and Conditions (GFTC) ライセンスに基づく Oracle GraalVM として、また「OTN License Agreement Oracle GraalVM Enterprise Edition Including License for Early Adopter Versions」[ 12 ]に同意することでアクセスできる Oracle GraalVM Enterprise Edition として、またはオープンソース ライセンスの Community Edition として利用できます。Oracle Corporation は、2019 年 5 月 8 日にOracle GraalVM Enterprise Edition のリリースを発表し、2023 年 6 月 13 日に、新しい GraalVM Free Terms and Conditions (GFTC) ライセンスを導入した Oracle GraalVMのリリースを発表しました。GraalVM は、x64 および AArch64 CPU 上の Linux および macOS プラットフォーム、および Windows x64 プラットフォーム上のデフォルトの JDK の代わりに使用できます。リリース スケジュールは、Oracle ヘルプ センターおよび GraalVM Web サイトに掲載されています。
GraalVMコンパイラであるGraalは、通常のJava仮想マシン( OpenJDK )のコンポーネントとともに同梱されています。GraalVMには、新しい実行モード(GraalVMネイティブイメージ)やプログラミング言語(LLVMランタイム、非推奨のNashornエンジンの代替となる可能性のあるGraalVM JavaScript、正規表現エンジンとしてのTRegex)を可能にするための追加コンポーネントが含まれています。
GraalVMコンパイラであるGraalは、最新のJava (JIT)コンパイラです。既存のコンパイラ(HotSpotのC1/C2)を補完または置き換えるものです。既存のコンパイラとは異なり、GraalはJava自体でモジュール化され、保守性と拡張性に優れた設計となっています。GPLバージョン2 (クラスパス例外付き)でリリースされています。
GraalVM Native Imageは、クラスファイルの実行可能バイナリを生成する事前コンパイル技術です。[ 13 ]これは早期採用技術としてリリースされており、本番環境での使用には適していますが、将来のリリースでは互換性のないアップデートがバックポートされる可能性があります。
この機能はJVMベースの言語をサポートしていますが、オプションでTruffleフレームワークを使用してGraalVM上で開発された動的言語も実行できます。実行ファイルはJVM上で実行されず、スレッドスケジューリングやGCなどの必要なランタイムコンポーネントは、Substrate VMと呼ばれる最小限の専用仮想マシンから利用されます。生成されるネイティブバイナリにはアプリケーションクラス、JDKの依存関係、ライブラリが既に含まれているため、起動時間と実行時間が大幅に短縮されます。
GraalVM Native Image は、Fn、Gluon、Helidon、Micronaut、Picocli、Quarkus、Vert.x、およびSpring Boot Java フレームワークによって公式にサポートされています。[ 14 ] [ 15 ]
2016 年 9 月、Oracle はJava SE 9用の GraalVM コンパイラを使用して OpenJDK に事前コンパイルを追加する計画の詳細を発表しました。 [ 16 ] [ 17 ]この提案はJEP 295: 事前コンパイルで追跡され、Java SE 9 に含まれました。[ 18 ] Java SE 10のLinux x64プラットフォームでは、ジャストインタイム コンパイラとして GraalVM の実験的な使用が追加されました。[ 19 ]
Java SE バージョン 9 から 15 では、このjaotcコマンドは実行可能ファイルを作成します。[ 20 ]実験的-XX:+EnableJVMCIProductフラグにより Graal JIT コンパイラの使用が可能になります。[ 21 ]この機能は、スタンドアロン GraalVM リリースの Native Image コンポーネントで利用可能になりました。[ 22 ]
Oracle LabsはGraalVMと連携して、GraalVM上で言語を実装できる「Truffle」と呼ばれる抽象構文木(AST)インタープリタを開発しました。 [ 23 ] [ 24 ] Truffleには多くの言語が実装されており、GCCやClangと同程度の速度を誇る実験的なCインタープリタも含まれています。[ 25 ]
Truffleフレームワークとその依存部分であるGraalVM SDKは、著作権やその他の親権に縛られたくないプロジェクトでのフレームワークの使用を促進するために、 Universal Permissive Licenseバージョン1.0の下でリリースされています。
GraalVMエコシステムの大きな利点は、言語に依存しない、VMランタイムに直接組み込まれた完全な動的計測サポートです。実行イベントは、完全に最適化されたコードで非常に低いオーバーヘッドでAPIクライアントによってキャプチャできます。[ 26 ] [ 27 ]
GraalVM のコアインストールには、インストルメンテーションやその他の VM サポートに基づく言語非依存のデバッガ、プロファイラ、ヒープ ビューアなどが含まれています。[ 28 ] GraalVM には、Chrome Inspector リモート デバッグ プロトコルのバックエンド実装も含まれています。[ 29 ]元々は JavaScript のデバッグ用に設計されていますが、ブラウザからすべての GraalVM 言語をデバッグするために使用できます。
GraalVM のもう 1 つの利点は、ゲスト言語のコードを Java に埋め込んで「ポリグロット」アプリケーションを作成できることです。[ 9 ]開発者は、JavaScript、Python、またはその他のサポートされている言語を Java ソースコード内に統合し、それらの言語特有の利点を得ることができます。ホスト Java アプリケーションとゲスト言語は、同じメモリ空間でデータをやり取りします。これは、Truffle Language Implementation Framework [ 30 ]と GraalVM Polyglot API のおかげで可能になります。以下は、Java から Python で定義された関数を呼び出す方法の例です。
try ( Context context = Context . create ()) {値関数= context.eval ( " python " , "lambda x : x + 1" );assert function.canExecute ( ) ;int x = function.execute ( 41 ) .asInt ( ) ;assert x == 42 ;}Python関数は入力値を1ずつ増やし、その結果をホスト言語に返します。Javaでは、セキュリティ上の理由から、まず変数関数が呼び出しによって実行可能かどうかを問い合わせcanExecute()、その後、呼び出しによって関数を呼び出しますexecute()。その他の例については、埋め込み言語のリファレンスドキュメントを参照してください。
GraalVMはJavaエコシステム向けに開発されています。Javaバイトコード形式にコンパイルされるすべての言語で記述されたアプリケーションを実行できます。例えば、Java、Scala、Kotlinなどです。
Truffle言語実装フレームワークに基づき、GraalVMで使用するために以下の追加言語が設計されています。
GraalVM のユーザーは、追加の言語のサポートを実装できます。注目すべきサードパーティの言語実装には、grCuda [ 38 ]、SOMns [ 39 ]、TruffleSqueak [ 40 ] [ 41 ]、Yona [ 42 ]などがあります。
では Graal をバックエンド (コード生成用) として使用する 'jaotc' という新しいツールが導入されます。
仮想マシンを起動する前に、アプリケーションの Java クラスをネイティブ コードにコンパイルします。
仮想マシンを起動する前に、Java クラスをネイティブ コードにコンパイルします。
JEP 317: 実験的な Java ベース JIT コンパイラ
年4 月 8 日取得。Truffle
Instruments は
、VM レベルのランタイム イベントを非常に細かく追跡して、GraalVM 上で実行されているアプリケーションのランタイム動作をプロファイリング、検査、分析できます。
開発者、インテグレーター、IT 管理者が GraalVM およびデプロイされたアプリケーションをデバッグおよび監視するためのツールセットを提供します。
ページをその場で編集したり、問題を迅速に診断したりできるため、最終的に、より優れたWebサイトをより速く構築できます。