原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/graalvm-for-jdk-21-is-here-ee01177dd12d
本日、私たちはJDK 21用のGraalVMをリリースします!
このリリースでは、Java 21の機能とならんで、多くの新しいGraalVM機能をお届けします。例えば、Project Loomのvirtual threadsは、Native Imageを含むGraalVMで完全にサポートされます。
ダウンロードはいつものところからどうぞ。
Download GraalVM
https://graalvm.org/downloads/
それでは、このリリースに含まれるものを見ていきましょう。Native ImageとGraalVM JDKの新機能についてはこのまま読み進めてください。TruffleとGraalVM言語のアップデートについては関連ブログ記事をご覧ください。
New Truffle and GraalVM Languages release
https://medium.com/graalvm/new-truffle-and-graalvm-languages-release-1e5c8cdaaff
https://logico-jp.io/2023/09/22/new-truffle-and-graalvm-languages-release/
このリリースの新機能は、ライブ・ストリームの録画でもご覧いただけます。
AOT at the Speed of JIT
前回のリリースのブログ記事で、Spring Petclinicを例にパフォーマンス比較を行いました。
A New GraalVM Release and New Free License!
https://medium.com/graalvm/a-new-graalvm-release-and-new-free-license-4aab483692f5#a7f7
https://logico-jp.io/2023/06/15/a-new-graalvm-release-and-new-free-license/#a7f7
起動時間、メモリ使用量、リクエスト/GB/sec、レイテンシなど、いくつかのパフォーマンス指標でNative ImageがJITを上回っていることを示しました。今回のリリースでは、同じPetclinicアプリについて、Native ImageがJITを上回っていることがわかります。
Oracle GraalVM Native Image上で動作するアプリケーションは、プロファイルガイド付き最適化(PGO)とG1 GCにより、ピークスループット13,075リクエスト/秒を達成する一方、C2 JITコンパイラとG1 GCで動作する場合には、12,488リクエスト/秒にとどまりました。
Optimize a Native Executable with Profile-Guided Optimizations
https://graalvm.org/latest/reference-manual/native-image/guides/optimize-native-executable-with-pgo/
Memory Management
https://graalvm.org/latest/reference-manual/native-image/optimizations-and-performance/MemoryManagement/

このベンチマーク(ヒープサイズ512MBで実行)から、さらにいくつかの性能観察結果を紹介します。

下のグラフは、ops/GB*s と特定の最大Java ヒープサイズ(-Xmxで指定)の相関関係を示しています。Oracle Native Imageが、すべてのヒープ・サイズにおいて、一貫して計算リソースあたりのスループットが大きくなっていることがわかります。そのため、Oracle GraalVM Native Imageを使用すると、あらゆるサイズのアプリケーションでメモリあたりのスループットが向上しますが、特に、最大1GB前後の小中規模のヒープを持つアプリケーションでは、JITで実行した場合と比較して、計算リソースあたりのスループットがほぼ2倍になります。

Native Imageを使用することで、ピークスループット、レイテンシ、メモリ使用量、スタートアップ、パッケージングサイズなど、すべてのパフォーマンスを最大化することができます。ぜひお試しいただき、ベンチマーク結果を共有してください。
いつも通り、このリリースでもNative Imageのパフォーマンスアップデートがあります。
G1 GC now works on Linux AArch64 (in addition to Linux x64)
Linux x64に加えてLinux AArch64でもG1 GCが動作するようになりました。コマンドラインまたはビルドファイルで--gc=G1をNative Imageに渡すことで有効化できます。多くのGC戦略が考えられますが、最高のピーク性能を求める方には、G1とPGOの組み合わせを評価することをお勧めします。
New optimization levels policy (-O3)
Native Imageには最適化レベルがあり、利用者が選択できます。開発時に高速ビルドが可能なクイックビルドモードのための-Obはご存じかもしれません。アプリケーションを本番用にビルドする場合、よりよいパフォーマンスのための最適化を設定してコンパイルするべきですが、カスタムオプションが提供されていない場合、Native Image のデフォルトは-O2です。この最適化レベルは高いパフォーマンスを提供し、コンパイル時間が10-15%速くなっていて、一般的なJavaマイクロサービスのワークロード用に調整されています。
このたび、Oracle GraalVMに新たな最適化ベル (-O3) を導入しました。これは、最高のピークパフォーマンスのために最大の最適化を適用するものです。この最適化レベルはご自身で有効にできますし、PGOを使用している場合は自動的に有効化されます。
Developer Experience
--parallelismオプション | このオプションを使って、ビルド・プロセスが使用するスレッド数を制御できるようになった。 【例】 --parallelism=4 |
| ビルド出力のアップデート | ビルド時の出力がアップデートされ、ビルドプロセスのメモリとスレッドの上限の表示や、--colorで出力の色を制御できるようになった。 |
| Native Imageビルドプロセスのメモリ制限の変更 | デフォルトでは、ビルドプロセスは空きメモリのみを使用する(このアプローチは、マシンや他のプロセスの速度を低下させないことを目的としている)。 空きメモリが 8GB 未満の場合、ビルドプロセスは総メモリの 85%を使用する。そのため、ネイティブビルド中にマシンの動作が遅くなるようであれば、不要なプロセスを閉じることを検討すること。 |
native-image-inspect | Oracle GraalVMのnative-image-inspectで、実行可能ファイルと共有ライブラリのヒープダンプが可能になった【例】 native-image-inspect --heap path/to/image |
| メタデータの欠落に対する特別例外処理 | 以前は、メタデータが見つからないとプログラムの動作不良につながることがあり、デバッグが困難だったが、このリリースで、メタデータ・エントリーが見つからない場合、それを必要とする呼び出しは特別な例外(例えばMissingReflectionMetadataException)で失敗するようになった。リソースや直列化メタデータが見つからない場合にも、同様の例外が発生する。 |
| 新たなクラス初期化戦略 | このリリースでは、将来デフォルトになる新しいクラス初期化手法が導入された。 [GR-39406] Add new class initialization strategy that allows all classes to be used at image build time #4684 https://github.com/oracle/graal/pull/4684 クラスの初期化設定に関係なく、すべてのクラスをビルド時に使用して初期化できるようになった。 --initialize-at-run-timeとして設定されているクラスは、実行時に再び初期化されていないものとして表示される。この新しいアプローチを有効にするには、--strict-image-heapフラグをNative Imageに渡す必要がある。この方法でエラーや問題が発生した場合は、10月24日のパッチ・リリースと一緒に発表されるブログ記事で詳細をお知らせする予定。 |
| guの削除 | guはNative ImageおよびGraalVM言語で不要になった。詳細は以下を参照。 [GR-46219] Remove the GraalVM Updater #6855 https://github.com/oracle/graal/issues/6855 |
| ThreadCPULoadイベントのサポート | JFRのThreadCPULoadイベントのサポートがBellSoftからコントリビュートされた。 [GR-45841] Add JFR event ThreadCPULoad #6588 https://github.com/oracle/graal/pull/6588 |
Experimental Build Options in Native Image
Native Image には多くのビルド・オプションがあります。
Native Image Build Options
https://graalvm.org/latest/reference-manual/native-image/overview/BuildOptions/
そのほとんどは安定していますが、中には実験的なものもあります。このリリースでは、使用されているオプションに対する認識と制御を改善し、誤用を避けるために、実験的なオプションを明示的に取り扱うための-H:±UnlockExperimentalVMOptionsという新たなオプションを追加しました。実験的なオプションのアンロックとロックの方法は以下の通りです。
native-image \
-H:+UnlockExperimentalVMOptions \
-H:SomeExperimentalOption \
-H:-UnlockExperimentalVMOptions \
-cp ./ HelloWorld
実験的オプションの明示的な有効化は、次のリリースで必要になる予定ですが、環境変数 NATIVE_IMAGE_EXPERIMENTAL_OPTIONS_ARE_FATAL=true を使用すると、現在でもGraalVM for JDK 21でテストできます。
現在パブリックAPIを安定化しているところなので、どの実験的な機能を積極的に使用しているか、対応するロードマップチケットにフィードバックをお寄せください。
[GR-47922] Enforce -H:±UnlockExperimentalVMOptions #7370
https://github.com/oracle/graal/issues/7370
Control Flow Integrity in Native Image
Oracle GraalVMは、サポート対象のハードウェア上でARM Pointer Authentication Code (PAC) を使用して、Control Flow Integrity (CFI) のフォームを提供するようになりました。PACは、関数呼び出しのリターンアドレスの完全性を保証することにより、return-oriented programming (ROP) 攻撃を緩和します。具体的には、リターンアドレスは関数エントリー時に署名され、関数リターン前に署名がチェックされます。改ざんはCPUによって検知されます。この機能は -H:EnableCFI オプションで有効化できます。
改ざんはCPUによって検知される。H:EnableCFIオプションで有効にできます。
JDK and Compiler updates
Oracle GraalVMでは、Java Vector API(JEP 448)操作の初期最適化を実装しました。
JEP 448: Vector API (Incubator)
https://openjdk.org/jeps/448
JVM上の複数の操作は、可能な限り効率的なマシン命令に変換されるようになりました。この最適化はデフォルトで有効になっており(-Dgraal.OptimizeVectorAPI=falseで無効にできます)、フィードバックをお待ちしています。
また、x64とAArch64の両アーキテクチャのJDK 21向けにintrinsicsを実装しました。
Refactoring GraalVM SDK
GraalVM SDKは、4つの細かいモジュールに分割されています。
GraalVM SDK Java API Reference
https://graalvm.org/sdk/javadoc/
org.graalvm.nativeimage | 高度なユースケースのためのNative ImageのパブリックAPI |
org.graalvm.polyglot | Polyglot言語実装をJavaに埋め込むためのライブラリ |
org.graalvm.word | Javaで機械語サイズの値を扱うための低レベルライブラリ |
org.graalvm.collections | GraalVMコンポーネント用のコレクションライブラリ |
このリリースでは、すべてのGraalVM APIに互換性があることに注意してください。
Ecosystem and Community
[1] GraalVMのMavenおよびGradleプラグインを含むNative Build Toolsは最新バージョン (0.9.27) がリリースされています。
Native Build Tools
https://graalvm.github.io/native-build-tools/latest/index.html#_release_0_9_27
[2] GraalVM Reachability Metadataは、いくつかの新たなコントリビュートがありました。以下はその例です。
org.apache.kafka:kafka-clientscommons-logging:commons-loggingorg.apache.httpcomponents:httpclientliquibase-coreorg.eclipse.paho.client.mqttv3- その他のプロジェクトのメタデータなど
[3] Micronaut® 4.0 がリリースされました。新たな GraalVM バージョンと GraalVM Reachability Metadataリポジトリをサポートしています。
Repository which contains community-driven collection of GraalVM reachability metadata for open-source libraries.
https://github.com/oracle/graalvm-reachability-metadata
[4] GraalVMとSpring Boot 3で、スループットとCPU使用率はそのままに、起動時間を30秒から約3ミリ秒に、メモリ使用量を6.6GBから1GBに削減した10MinuteMailの事例が共有されています。
[5] BallerinaチームもGraalVMを使った類似の結果を紹介してくれています。彼らのアプリケーションはGraalVMで起動時間980ミリ秒から52ミリ秒に、RSSは242MBから93MBになりました。
[6] Matt Raible氏 (@mraible) は、ネイティブJava REST APIフレームワークのパフォーマンスを比較しています。
Conclusion
この場を借りて、このリリースに寄せられたすべてのフィードバック、提案、貢献に感謝します。このリリースに関する追加のフィードバックや、将来のリリースで見たい機能に関する提案がありましたら、Slack、GitHub、またはTwitterで共有してください。
Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm
GraalVM言語およびTruffleのアップデートについては、以下のブログエントリをご覧ください。
New Truffle and GraalVM Languages release
https://medium.com/graalvm/new-truffle-and-graalvm-languages-release-1e5c8cdaaff
https://logico-jp.io/2023/09/22/new-truffle-and-graalvm-languages-release/
新しいGraalVMを試してみてください!🚀
Download GraalVM
https://graalvm.org/downloads/