GraalVM 22.3 is here: JDK 19 builds, jlink support, new monitoring features, and more!

原文はこちら。
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

“Game of life” performance in AOT and JIT modes.

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
GraalVM Native Imageで生成されたネイティブ実行ファイルとして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 reportperf記録セッション (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倍に、foppmdなどの個々のベンチマークでは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.minMath.maxだけではない)、符号なし最大/最小、折り返し型ループ(例えば、配列の最小または最大要素の計算)を扱うことができるようにしました。例えば、以下のようなint型配列の最小値を計算する場合、およそ8倍高速になっています。

int min = Integer.MAX_VALUE;
for (int x : someArray) {
    min = Math.min(min, x);
}

この最適化もまたデフォルトで有効になっています。

StripMineCountedLoops とEarlyGVN コンパイラ最適化の導入

StripMineCountedLoopsEarlyGVNのコンパイラ最適化が22.2で実験的なものとして導入されましたが、このたびデフォルトで有効化されました。

Meet GraalPy!

GraalPythonGraalPyになりました!私たちはプロジェクトとランチャーの名前を変更しました:graalpythonは今、graalpyです。私たちは、この新しい名前がPythonのエコシステムとよりよく調和すると信じています。ご意見をお寄せください。

また、GraalVMのランチャーは、PythonのIDEやツールとのより良い統合のために、pythonpython3からgraalpyへのシンボリックリンクを含むようになりました。

FlaskがGraalPy上で動作するようになりました。Flask はマイクロwebフレームワークで、開発サーバーやデバッガー、ユニットテストのサポート、エクステンションなどの機能を備えています。

GraalPy running a Flask server with benchmark results for importing pygal in AST interpreter mode and bytecode interpreter mode.

多くの互換性のための作業も完了しました。CPythonの新しいPEG文法定義から生成される新しいパーサーに切り替えました。これにより互換性が向上し、astモジュールの実装が可能になっています。

PEP 617 – New PEG parser for CPython
https://peps.python.org/pep-0617/

また、Tracing APIとProfiling APIのサポートを追加し、GraalPyでそれぞれpdbprofileパッケージのサポートが可能になりました。さらに、既知のパッケージに対して自動的に最適なバージョンを選択するよう、pipを更新しました。そのため、pip install pandasを実行すると、GraalPyはCIでテスト済みのpandasnumpyのバージョンを自動的に選択するようになっています。

そのほか、以前のリリースで導入された新たなバイトコードインタプリタがデフォルトで有効になっています。この変更により、良好なピークパフォーマンスはそのままに、起動パフォーマンスやメモリフットプリントが改善されています。例えば、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を紹介し、いくつかの有望な結果を示しています。

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」という名前が大好きなんです。

Grabbit — the new GraalVM mascot.

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に感謝します。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中