原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/graalvm-22-3-is-here-jdk-19-builds-jlink-support-new-monitoring-features-and-more-f6e2b2eeff95
本日GraalVMをリリースしました。
このリリースには、JDK 19ビルド、jlinkのサポート、新しい監視機能、新しいNative Image APIなどが入っています。
2022年の最後の機能リリース (feature release) として、GraalVM Community 22.3は今後12ヶ月間アップデートを受けることができます。そのため、もしGraalVMのバージョンのアップグレードを検討しているなら、今がその絶好の機会です。
いつも通り、GraalVM CommunityはGitHubからダウンロードできます。GraalVM EnterpriseビルドはOTNからダウンロードできます。アップデートに関する詳細はリリースノートをチェックしてください。
graalvm/graalvm-ce-builds
https://github.com/graalvm/graalvm-ce-builds/releases
GraalVM Enterprise Downloads
https://oracle.com/downloads/graalvm-downloads.html
22.3.0 Release Notes
https://graalvm.org/release-notes/22_3/
GraalVM JIT and Native Image will become a part of OpenJDK
Before we talk about GraalVM 22.3の話に入る前に、最近の重要なアップデートについて言及したいと思います。JavaOneでGraalVM CEのJavaコードがOpenJDKの一部になることを発表しました。この変更はGraalコンパイラやNative ImageというCEのパーツに及びます。この変更と、この変更によるGraalVMコミュニティや幅広いJavaエコシステムへのインパクトにわくわくしています。
これはつまり、OpenJDKコミュニティが使用しているものと同じ方法論とアプローチを採用するということです。これには、JEPと同様にコミッターとレビュアーの役割を持つことも含みます。また、リリース・モデルの調整も行います。つまり、この発表の変更が行われた後、GraalVMは、CPU (Critical Patch Update) リリースを四半期ごとに、機能リリース (feature release) を6ヶ月ごとに、そしてLTS (Long term support) リリースを2年ごとに行う予定です。
発表の全文と詳細は、GraalVMのウェブサイトをご覧ください。
Oracle Contributing GraalVM Community Edition Java Code to OpenJDK
https://graalvm.org/2022/openjdk-announcement/
それでは、今回のリリースの新機能をご紹介します。
また、ライブストリームの録画で、新機能について話したり、実際に動かしてみたりしていますので、是非ご覧ください。
GraalVM JDK 19 builds
すでに開発者用ビルドでGraalVM JDK 19ビルドを試されたかもしれませんが、今度は通常のGraalVMビルドのJDK 19も利用できるようになりました。GraalVM 22.3は、JDK 11、17、19向けにリリースされていますが、GraalVM 23.0ではJDK 11のサポートを終了する予定です。GraalVM JDK 11ビルドは、22.3.xのリリースで2023年中は更新し続けるので、GraalVM JDK 11のままでも良いですが、Javaのプレビュー機能にアクセスするためにJDK 17以後に移行されることをお勧めします。
graalvm/graalvm-ce-dev-builds
https://github.com/graalvm/graalvm-ce-dev-builds/releases
Add support for JDK19 and retire JDK11 support – Issue #5063
https://github.com/oracle/graal/issues/5063
そして、移行する良い理由があります – 例えば、GraalVM JDK 19は、コンパイラ、Native Image、(Java on Truffleを除く)GraalVM言語などのすべてのGraalVMコンポーネントには、Project Loom由来の仮想スレッド (Virtual Threads) など、最新のJava機能のサポートが含まれています。私たちのGame of life Nativeデモ(ビルドファイルまたはコマンドラインで--enable-preview
オプションを使用してLoomのロックを解除してください)でGraalVM上での仮想スレッドを試してみてください。これは、GraalVM Native Imageで生成されるネイティブ実行ファイルとして、高度に並行で計算集約型のデモアプリケーションです。
Game of Life Native
https://github.com/graalvm/game-of-life-native

GraalVM JDK 19のこのリリースは実験的なものであることを心に留めておいてください。GraalVM 23.0でJDK 19のサポートを計画しています。また、ランタイムコンパイルが有効な場合、GraalVM言語では仮想スレッドは未サポートです。
Add support for JDK19 and retire JDK11 support #5063
https://github.com/oracle/graal/issues/5063
One-line GraalVM JDK Downloads
GitHub、Oracle Technology Network、GitHub Action、VS Code拡張、SDKManからのGraalVMダウンロードに加え、便利なワンライン・コマンドによるダウンロードが可能になりました。
Release GraalVM Community Edition 22.3.0
https://github.com/graalvm/graalvm-ce-builds/releases/latest
Oracle GraalVM Downloads
https://www.oracle.com/downloads/graalvm-downloads.html
GitHub Action for GraalVM
https://github.com/marketplace/actions/github-action-for-graalvm
GraalVM Tools for Java
https://marketplace.visualstudio.com/items?itemName=oracle-labs-graalvm.graalvm
このコマンドはローカル開発ならびにビルドパイプラインの両方で使用できます。まずは、以下のコマンドを実行してみてください。デフォルトでは、Native Imageを含むサポート対象の最新JDKバージョンの最新のGraalVMリリースをダウンロードします。
bash <(curl -sL https://get.graalvm.org/jdk)
詳細ならびにカスタマイズについては以下のブログエントリをご覧ください。
One-line GraalVM JDK Downloads
https://medium.com/p/91ee8d4e6ffd/
https://logico-jp.io/2022/10/27/one-line-graalvm-jdk-downloads/
Simple Webserver as a Native Image
Java 18の時点で、プロトタイピング、テスト、デバッグのための最小限のHTTPサーバーであるjwebserverツールを利用できていますが。GraalVM JDK 19で、同じこと、いやそれ以上のことができるようになりました。jwebserverをネイティブアプリケーションにコンパイルできるようになったのです。以下のコマンドを実行するだけです。
$JAVA_HOME/bin/native-image -m jdk.httpserver -o jwebserver

Native Image monitoring and developer experience updates
毎回のリリースと同様に、Native Image の監視機能の拡張に取り組みました。
–enable-monitoring=<all,heapdump,jfr,jvmstat>
オプションの追加
これは、実行ファイルに含まれる監視機能をきめ細かく制御するためのもので、-H:±AllowVMInspection
オプションの置き換えです。今後は-H:±AllowVMInspection
オプションは使用しないでください。
Native Imageでのjvmstat
のサポート追加
jvmstat
を使用すると、例えば、実行時にネイティブ実行ファイルのパフォーマンスとリソース消費を監視できます。また、VisualVMでヒープダンプを簡単にキャプチャできます。
VisualVM
https://graalvm.org/22.3/tools/visualvm/#capture-a-heap-dump
Native ImageのJFRサポート強化
コミュニティとともに、Native ImageのJFRサポートを強化しています。22.3では以下の3個のイベントのサポートが追加されています。Red Hatからのコントリビューションに感謝します。
JavaMonitorEnter
JavaMonitorWait
ThreadSleep
デバッグ体験の改善
メモリ使用量やメモリリークを簡単に特定できるように、デバッグのエクスペリエンスを改善しました。例えば、perf report
はperf
記録セッション (record session) でサンプリングされたコードアドレスを Java メソッドに関連付け、そのメソッドのDWARF由来のメソッド名を出力ヒストグラムに表示することができるようになりました。これもRed Hatからの貢献によるものです。
ソフトウェア部品表(SBOM)
アプリケーションにSBOMを埋め込むには、新しいAPIオプション --enable-sbom
を使う必要があります。
GraalVM Native Imageのインストーラサイズの削減
GraalVM Native Imageのインストーラサイズを ~120 MB から ~30 MB に縮小しました。LLVMバックエンドは、現在、オプションのnative-image-llvm-backend
コンポーネントとして出荷されていることに注意してください。
LLVM Backend for Native Image
https://graalvm.org/22.3/reference-manual/native-image/LLVMBackend/
GraalVM Native Build Tools and Reachability Metadata
Native Build Tools 0.9.15をリリースしました。まだの方はアップグレードしてください。
Native Build Tools
https://graalvm.github.io/native-build-tools/latest/index.html#_release_0_9_15
22.2以降、Hibernate、Jetty、Thymeleaf、JAXB、および他のライブラリのための新規もしくは更新されたメタデータを含むGraalVM到達性メタデータのいくつかのバージョンをリリースしています。
Repository which contains community-driven collection of GraalVM reachability metadata for open-source libraries.
https://github.com/oracle/graalvm-reachability-metadata
GraalVMリーチャビリティ・メタデータを始めるには、以下をチェックしてください。
Reachability Metadata
https://graalvm.org/22.2/reference-manual/native-image/metadata/
New Native Image API
Native Imageをフル活用したいライブラリやフレームワークの作者のために、FeatureインターフェースクラスからJNI、Resource、Proxy、Serializationクラスをプログラム的に登録するための新しいパブリックAPIが追加されました。また、メソッド置換のためのアノテーションをGraalVM SDKに移動しました。
GraalVM Standard Development Kit
https://github.com/oracle/graal/tree/master/sdk
org.graalvm.nativeimage:svm
アーティファクト(native-image
内部へのアクセスに使用されたもの)はGraalVM 22.3.0でもまだMaven Centralで公開されてはいますが、廃止予定ですので、代わりに GraalVM SDKに移行してください。不足のAPIや機能があれば、私たちにフィードバックしてください。
Compiler Updates
最新のJava機能
GraalVM JDK 19ビルドでは、仮想スレッド、簡易Webサーバー、structured concurrency などの最新のJava機能をGraalVMで使用できます。
Graalコンパイラ
Graalコンパイラは、現在、libgraalコンパイラのスレッドごとに1つのisolate (分離) を使用しています。このポリシーにより、コンパイルごとのisolationが向上し、コンパイラのGCが少なくなり、コンパイルのスループットとメモリフットプリントが大幅に改善されています。DaCapoベンチマークでは、バイトコード/秒単位で測定したコンパイル速度が少なくとも2倍に、fop
やpmd
などの個々のベンチマークでは3倍の速度向上を示しました。このポリシーはデフォルトで有効になっており、無効にするには、次のオプションを使用します。
-XX:JVMCINativeLibraryThreadFraction=0.66 -XX:JVMCIThreadsPerNativeLibraryRuntime=0
専用Native Image GCポリシーの追加
Eden スペースを積極的に調整して RSS メモリの使用量を最小化することを目的に、Graal コンパイラ専用の Native Image GC ポリシーを追加しました。このポリシーもデフォルトで有効になっています。
jlink
jlink
でGraalコンパイラをトップTierコンパイラとして利用するイメージを生成できるようになりました。 java --version
コマンドを実行すると、JDKとしてGraalVMが表示されます。
整数のmin/max演算のループベクトル化
整数のmin/max演算のループベクトル化を実装しました。このような演算がより高速になるはずです。この実装では、すべての整数サイズ、手書きのmin/maxパターン(例えば x > y ? x : y
。つまりMath.min
や Math.max
だけではない)、符号なし最大/最小、折り返し型ループ(例えば、配列の最小または最大要素の計算)を扱うことができるようにしました。例えば、以下のようなint
型配列の最小値を計算する場合、およそ8倍高速になっています。
int min = Integer.MAX_VALUE;
for (int x : someArray) {
min = Math.min(min, x);
}
この最適化もまたデフォルトで有効になっています。
StripMineCountedLoops とEarlyGVN コンパイラ最適化の導入
StripMineCountedLoops
とEarlyGVN
のコンパイラ最適化が22.2で実験的なものとして導入されましたが、このたびデフォルトで有効化されました。
Meet GraalPy!
GraalPython
はGraalPy
になりました!私たちはプロジェクトとランチャーの名前を変更しました:graalpythonは今、graalpyです。私たちは、この新しい名前がPythonのエコシステムとよりよく調和すると信じています。ご意見をお寄せください。
また、GraalVMのランチャーは、PythonのIDEやツールとのより良い統合のために、python
とpython3
からgraalpy
へのシンボリックリンクを含むようになりました。
FlaskがGraalPy上で動作するようになりました。Flask はマイクロwebフレームワークで、開発サーバーやデバッガー、ユニットテストのサポート、エクステンションなどの機能を備えています。

多くの互換性のための作業も完了しました。CPythonの新しいPEG文法定義から生成される新しいパーサーに切り替えました。これにより互換性が向上し、ast
モジュールの実装が可能になっています。
PEP 617 – New PEG parser for CPython
https://peps.python.org/pep-0617/
また、Tracing APIとProfiling APIのサポートを追加し、GraalPyでそれぞれpdb
とprofile
パッケージのサポートが可能になりました。さらに、既知のパッケージに対して自動的に最適なバージョンを選択するよう、pip
を更新しました。そのため、pip install pandas
を実行すると、GraalPyはCIでテスト済みのpandas
とnumpy
のバージョンを自動的に選択するようになっています。
そのほか、以前のリリースで導入された新たなバイトコードインタプリタがデフォルトで有効になっています。この変更により、良好なピークパフォーマンスはそのままに、起動パフォーマンスやメモリフットプリントが改善されています。例えば、pip install <パッケージ>
や REPL での import <パッケージ>
の実行といった開発時のアクションは、20-25%高速化され、メモリ消費は平均で約25%削減しました。
GraalVM LLVM Runtime on Windows
GraalVM LLVM Runtime for Community EditionがWindowsで利用可能になりました。これにより、Windows上でGraalPyと他のGraalVM言語のためのサポートを追加できるようになります。
このリリースではまだ実験的なものですので、是非お試しいただいて、フィードバックをお寄せください。まずはここからどうぞ。
GraalVM LLVM Runtime
https://www.graalvm.org/reference-manual/llvm/
Polyglot Embedding
Context.Builder.allowInnerContextOptions(boolean)
を追加しました。これによりコンテキストが内部コンテキストを生成し、言語オプションを変更・上書きできるようになり、内部コンテキストが初期コンテキストとコードを共有しません。この権限のデフォルト値はContext.Builder.allowAllAccess(boolean)
が設定されているかどうかに応じて決まります。セキュリティが重要なシナリオでは、この権限を有効にしないでください。
Ruby
TruffleRubyで追加された新機能です。
Java.add_to_classpath
メソッドが追加され、実行時にJARのパスを追加できるようになりました。- Ruby 3.1のHash短縮記法とpunning構文、および匿名ブロック転送 (anonymous block forwarding) 構文をサポートするようになりました。
- Java との相互運用性を向上させました。相互運用の境界で Java の文字列と Ruby の文字列を変換する必要がなくなりました。
パフォーマンスと互換性も改善しています(特に、ホストのインライン化を最適化することにより、インタプリタのパフォーマンスを向上させました)。完全な変更履歴は以下からどうぞ。
CHANGELOG.md
https://github.com/oracle/truffleruby/blob/master/CHANGELOG.md#2230
Community Updates
この機会に、GraalVM コミュニティと関連プロジェクトからのアップデートについても触れておきたいと思います。
Spring Boot
Spring Boot 3.0.0 RC1では、AOT処理とGraalVM Native Imageのサポートが改善されました。
Spring Boot 3.0.0 RC1 Release Notes
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0.0-RC1-Release-Notes
Spring Framework 6.0とSpring Boot 3.0の最新のAOTとNativeのアップデート概要は、Stéphane NicollとBrian Clozelによるプレゼンテーションをご覧ください。
Micronaut
Micronautは、新しいTest Resources機能を導入しました。これにより、外部の依存関係(例えばTestcontainers経由)に対するテストが簡単になります。これはJITとNative Imageモードの両方で動作します。
Introducing Micronaut Test Resources
https://melix.github.io/blog/2022/08/micronaut-test-resources.html
Quarkus
Quarkusチームは、QuarkusとGraalVMを使い始めるための広範囲なガイドを最近公開しました。
Quarkus fundamentals
https://dev.to/pierregmn/quarkus-fundamentals-n77
Helidon
Helidonチームは、仮想スレッドに基づくマイクロサービスフレームワークであるHelidon Nímaを紹介し、いくつかの有望な結果を示しています。
https://medium.com/helidon/please-welcome-helidon-n%C3%ADma-9a882c5b6f1e#29ad
https://logico-jp.io/2022/10/23/please-welcome-helidon-nima/#29ad
JetBrains
IntelliJ IDEA 2022.2では、GraalVM Native Image によって生成されたネイティブ実行ファイルのデバッグを実験的にサポートするようになりました。
IntelliJ IDEA 2022.2 Is Out!
https://blog.jetbrains.com/idea/2022/07/intellij-idea-2022-2/
JUnit
JUnit 5.9.1で、アノテーション @EnabledInNativeImage
と @DisabledInNativeImage
を導入し、GraalVM Native Image によって生成されたネイティブ実行ファイルをテスト対象に含める/含めないをユーザーが設定できるようになっています。
JUnit 5 Release Notes
https://junit.org/junit5/docs/current/release-notes/index.html#release-notes-5.9.1
EnabledInNativeImage
https://junit.org/junit5/docs/snapshot/api/org.junit.jupiter.api/org/junit/jupiter/api/condition/EnabledInNativeImage.html
DisabledInNativeImage
https://junit.org/junit5/docs/snapshot/api/org.junit.jupiter.api/org/junit/jupiter/api/condition/DisabledInNativeImage.html
その他
コミュニティは GraalVM を使って Minecraft サーバーをネイティブ実行ファイルにコンパイルしました。どうやったのか、ブログエントリをご覧ください。
Native Minecraft Servers with GraalVM Native Image
https://medium.com/graalvm/native-minecraft-servers-with-graalvm-native-image-1a3f6a92eb48
Community contributions
いつものように私たちは、このリリースに協力してくれたコミュニティとエコシステムのパートナーに感謝しています。GraalVM をより良いものにするために役立つレポートやコントリビューションをGitHub にたくさん寄せられています。ここではそのうちのいくつかを紹介します。
Red Hat
新しいJFRイベントのサポートとNative Imageでのデバッグの改善に貢献いただきました。
Jet Brains
Intellij IDEAチームが、GraalVM Native Imageで生成されるネイティブ実行ファイルのデバッグ改善のために有益なフィードバックを提供してくれました。
Spring Boot / Micronaut
GraalVM到達可能性メタデータリポジトリと native-build-tools を構築するのに協力してくれました。
GraalVM reachability metadata for open-source libraries
https://github.com/oracle/graalvm-reachability-metadata
Native-image plugins for various build tools
https://github.com/graalvm/native-build-tools
Shopify
TruffleRuby から TruffleString への移行に貢献くださいました。
Migrate to TruffleString #2663
https://github.com/oracle/truffleruby/pull/2663
Meet Grabbit!
GraalVMにマスコットができました。Grabbitです。本当はウサギなのですが、私たちは「Grabbit」という名前が大好きなんです。

GraalVMに関するブログ記事やプレゼンテーションにご自由にお使いください。近日中に、ロゴとその他のブランド資産を含むページをコミュニティで共有する予定です。
Conclusion
GraalVMコミュニティの皆様に対し、本リリースへのフィードバック、ご提案、ご協力に感謝申し上げます。このリリースに関する追加のフィードバックや、将来のリリースに追加して欲しい機能に関する提案があれば、Slack、GitHub、Twitterで共有してください。
Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm
Fabio NiephausとShaun Smithに感謝します。