GraalVM と OpenJDK の連携は Java の新時代を意味する

オラクルは、GraalVM Community Edition Java コードを OpenJDK に提供します。 この単純なステートメントの背後には多くのことがあります。 しかしその前に、まず GraalVM が実際に何をするかを見てみましょう。

最近の GraalVM への関心の高まりは、 つぶやき Java コミュニティ内で興奮を巻き起こしました。

オラクルは、GraalVM Community Edition Java コードを OpenJDK に提供して、GraalVM テクノロジーの開発を Java の開発とより緊密に連携させています。

ここでは 2 つのテクノロジーが使用されています。 定評のある OpenJDK と、新参者の GraalVM です。

非常に高いレベルで、GraalVM は 2 つの側面に分割されたランタイムです。 バイトコードをネイティブの自己完結型実行可能ファイル (別名ネイティブ イメージ) にコンパイルし、Java 以外の言語で JVM 上でプログラムを実行します。

最初の側面によると、ネイティブ イメージは、アプリケーション、そのすべての依存関係、およびランタイム コンポーネントを含む実行可能なバイナリ ファイルであり、ランタイムのインストールやセットアップを必要とせずに、サポートされている任意の構成で JVM ベースのプログラムを実行できます。 ネイティブ イメージは、プログラムを配布して起動するための最も簡単な方法です。

ネイティブ イメージには、JVM インタープリター型アプリケーションよりもいくつかの利点があります。

  • ほぼ瞬時の起動時間
  • 最適化されたリソース消費とより小さい静的フットプリント
  • 実行に JVM を必要としない

AOT によるネイティブ イメージは、Java をクラウド時代に対応させる上で重要であり、その中で大きな役割を果たします。 たとえば、Spring Native Beta が利用可能になり、GraalVM ネイティブ イメージ コンパイラを使用して Spring アプリケーションをネイティブ イメージにコンパイルすることで、Spring アプリケーションをデプロイする新しい方法がもたらされました。 または、GraalVM が Micronaut のデータ プロジェクトの Ahead of Time (AoT) コンパイルを有効にして、リポジトリ インターフェースのクエリを事前に計算し、それをシンで軽量なランタイム レイヤーによって実行する方法。 これには以下が必要です。

  • ランタイム モデルなし – Spring Data は、リフレクションを使用してエンティティ間の関係をモデル化するランタイム メタモデルを維持します。 このモデルは大量のメモリを消費し、アプリケーションのサイズが大きくなるにつれてメモリ要件も大きくなります。 独自のメタモデルを維持する Hibernate と組み合わせると、メタモデルが重複してしまうため、問題はさらに悪化します。
  • クエリ変換なし – Spring Data は、実行時に生成されたプロキシと組み合わせて正規表現とパターン マッチングを使用して、Java インターフェースのメソッド定義を実行時にクエリに変換します。 そのようなランタイム変換は Micronaut データには存在せず、この作業はコンパイル時に Micronaut コンパイラによって実行されます。
  • リフレクションまたはランタイム プロキシなし – Micronaut Data はリフレクションまたはランタイム プロキシを使用しないため、リフレクション キャッシュが完全にないため、パフォーマンスが向上し、スタック トレースが小さくなり、メモリ消費が削減されます (Hibernate などのバッキング実装ではリフレクションが使用される場合があることに注意してください)。 .
  • 型の安全性 – Micronaut Data は、リポジトリ メソッドを実装できることをコンパイル時にアクティブにチェックし、実装できない場合はコンパイルに失敗します。

2 つ目の側面として、仮想マシンは、プラットフォームや基盤となるハードウェアに関係なく、独立した方法でプログラムを実行するために発明されました。 例は . NET CLR、MoarVM、Raku プログラミング言語を実装する Rakudo コンパイラ用に構築された最新の仮想マシン、そしてもちろん JVM です。 当初、JVM は、Java コンパイラから生成されたバイトコードを実行することにより、プラットフォーム間で Java を移植可能にするために構築されました。 すぐに、Scala、Kotlin、Groovy、Clojure など、JVM のバイトコードを発行できる他の言語が登場し、JVM のアプリケーションが Java を超えて拡張されました。

今日では、コンピューティングの問題は、多数の言語で見つかった機能やライブラリを組み合わせることで解決できる場合があるため、それでも十分ではありませんでした。 GraalVM は、JVM で動作するように設計されたことのない言語を 1 つの屋根の下にまとめようとする試みです。 Javascript、Python、Ruby などの動的言語と、C/C++、Rust、Swift、Fortran などの静的言語について話しています。

この相互運用性は、自己最適化抽象構文木 (AST) インタープリターとして表現されるプログラミング言語実装を構築するためのライブラリーである Truffle を通じて実現されています。 つまり、カスタム プログラミング言語のインタープリターを簡単に開発できます。実装者は自分の言語用の Java ベースの AST インタープリターを作成するだけで済み、その後 Graal によって JIT コンパイルされてマシン コードになります。 Graal は、Truffle インタープリターとして実装されている任意の言語をコンパイルできることに注意してください。

残念ながら、Oracle が OpenJDK に提供している GraalVM のコードには Truffle が含まれていません。 代わりに、オラクルは GraalVM ジャストインタイム (JIT) コンパイラとネイティブ イメージの最も適切な部分を提供し、その過程でいくつかのことを明確にする予定です。 つまり、GraalVM は別のライセンスを維持しながら、OpenJDK と並行して開発されていました。 現在の計画では、リリースの観点とライセンスの観点の両方から、すべての GraalVM テクノロジーを Java に合わせる予定です。 もちろん、GraalVM CE エディションについて話しています。 Enterprise は影響を受けず、OpenJDK プロジェクトとマージされません。

GraalVM リリースを JDK リリース モデルに合わせると、次のようになります。

  • リリースごとに 1 つの Java SE プラットフォーム仕様のサポート
  • 年に 2 回の機能リリース
  • 年に 4 回の予測可能な四半期ごとのクリティカル パッチ アップデート
  • 2 年ごとの長期サポート リリース

簡単に言うと、GraalVM は年に 2 回、LTS と JEP のリリースを行いますが、コミュニティに問題を処理させることで、新機能の開発がスピードアップし、プロジェクトの長寿に信頼性を植え付けることができます。

この発表は、GraalVM のバージョン 22.3 のリリースと同時に行われました。

  • GraalVM 22.3 が JDK 11、17、および 19 用にリリースされ、GraalVM 23.0 で JDK 11 のサポートを廃止する予定です
  • 次のように、1 行のコマンドでダウンロードする新しい方法
    bash <(curl -sL https://get.graalvm.org/jdk)
  • Java 18 以降、プロトタイピング、テスト、およびデバッグ用の最小限の HTTP サーバーである jwebserver ツールを使用できます。 GraalVM JDK 19 では、まさにそれが可能になり、さらに jwebserver をネイティブ アプリケーションにコンパイルできるようになりました
  • ネイティブ イメージ監視
  • GraalVM ネイティブ ビルド ツール
  • 新しいネイティブ イメージ API

もっと。

また、バージョン 22.2 からの重要な継承:

内部データ構造がいくつか改善されたおかげで、ネイティブ イメージがネイティブ実行可能ファイルをビルドするときに必要なメモリが大幅に減少しました。

メモリ使用量の削減は、クラウド サービスや GitHub アクションなど、メモリに制約のある環境で特に有益です。 リリース 22.2 以降、ネイティブ イメージ ツールは、わずか 2 GB の Java ヒープで多くの大規模なネイティブ実行可能ファイルを正常にビルドできます。

Java にとって非常にエキサイティングな時代です。 GraalVM、AOT、および JakartaEE 10 Core Profile の新しいリリースにより、Java はクラウドを支配するための主要な位置にしっかりと位置付けられます。

詳しくは

公式発表

関連記事

Spring Native を使用して Spring アプリケーションをネイティブ イメージにコンパイルする

隠れたGraalVM

GraalVM ベースの実行可能ファイルを簡単にする

TornadoVM により、GPU および FPGA 上で Java を実行できるようになります

Jakarta EE 10 – クラウド上の Java の新時代

Micronaut 3.2 がリリースされ、マイクロサービスのパフォーマンスが向上

I Programmer の新しい記事について通知を受けるには、毎週のニュースレターにサインアップし、RSS フィードを購読して、フォローしてください。 ツイッター、 Facebook または Linkedin。

バナー

ピコブック

コメント

または、コメントを電子メールで送信してください: comments@i-programmer.info

.

Leave a Comment

Your email address will not be published. Required fields are marked *