原文はこちら。
The original entry was written by Oleg Šelajev (Developer advocate for GraalVM at Oracle Labs).
https://medium.com/graalvm/graalvm-20-3-is-available-d2a7f7a2bbcd
本日GraalVM 20.3.0のリリースを発表いたします。これは2020年最終のfeature releaseでGraalVM 20.xをご利用であればチェックいただき、アップデートなさることを推奨いたします。また。これはGraalVM Enterpriseで最初のLong-term support (LTS) です。現在19.xや20.xをお使いの場合、近い将来に20.3へのアップグレードを検討ください。
【訳注】GraalVM Enterpriseのバージョンロードマップ
Versions Roadmap of Oracle GraalVM Enterprise Edition
https://docs.oracle.com/en/graalvm/enterprise/20/docs/overview/version-roadmap/
サポートについて
https://www.graalvm.org/support/
毎回のリリースと同様に、素晴らしいGraalVMコミュニティの皆様からのフィードバック、共同作業や問題点の議論、ドキュメントへのプルリクエストやアップデートの送信、そして大事なことをひとつ言い残しましたが、GraalVMプロジェクトとGraalVMが貴プロジェクトでにどのように役立つのかを広めてくださったことに感謝しています。私たちと一緒に、GraalVMエコシステムを素晴らしいものにしていきましょう。
GraalVM 20.3.0は今すぐダウンロードできます。
- GraalVM Community Edition
https://www.graalvm.org/downloads - GraalVM Enterprise Edition
https://www.oracle.com/downloads/graalvm-downloads.html
この記事では、GraalVM 20.3.0で最も注目すべき変更点をご紹介します。多数のコンポーネントがあり、毎リリースでそれらのすべてが改善、修正されています。変更点の詳細リストをご所望の方は、リリースノートをご覧ください。
GraalVM 20.3.x Release Notes
https://www.graalvm.org/release-notes/20_3/
Platform updates
GraalVMコンパイラはGraalVMプロジェクトの中心となるものです。このコンパイラにより、GraalVMがJavaベンチマークで最高の結果を示すことを可能にしますし、ネイティブイメージを構築する際の先行コンパイルに使用されたり、Truffle言語実装フレームワーク上で動く言語のパフォーマンスを最適化するため使用されたりします。そのため、コンパイラのアップデートはすべて非常に重要であり、GraalVMエコシステムのほぼすべてのプロジェクトに影響を及ぼします。
GraalVM 20.3では、コンパイラに注目すべき多くの改良が加わっています。20.3.0では、GraalVM Enterpriseのシミュレーションベースのループピーリングを支援するヒューリスティックが強化されました。これはとりわけ、ループの最初のイテレーションで配列内のオブジェクトが遅延初期化され、後から使用される場合に有効です。このため、いくつかのPythonマイクロベンチマークでは、最大40%の性能向上が見られました。配列といえば、新しく割り当てられた配列を初期化するためのコード生成が改善され、特定の大きな配列割り当て(8~128MBの大容量)が2回初期化されてしまうという問題が修正されました。もう一つの特に興味深い変更点は、GraalVM Enterprise 20.3.0の高度なコード重複最適化の領域に入った変更です。このリリースでは、重複発見の誤判断に対処しています。その結果、いくつかのLLVMビットコードワークロードで最大17%、関連するJavaワークロードでは5%のピークパフォーマンスの向上が見られます。
以前のリリースで導入されたlibgraalは、GraalVMコンパイラのコンパイル速度を劇的に向上させました。しかし、初期化時にはまだ少量のクラスロードが行われていました。これは、反復回数が非常に短いマイクロベンチマークのウォームアップカーブで確認できました。例えば、”Are We Fast Yet?” ベンチマーク・スイートの NBody ベンチマークでは、最初の 2 回のベンチマーク・イテレーションにおいて、C2 では 45 ミリ秒であったのに対し、libgraal では ~110 ミリ秒かかりました。このクラスロードは、現在では libgraal から除かれていたり、libgraal の初期化が済むまで遅延されています。このクラスロードを排除したことの二次的な利点は、JIT コンパイラがクラスをロードしないという VM の仮定に関連する問題を修正したことです。
Are We Fast Yet? Comparing Language Implementations with Objects, Closures, and Arrays
https://github.com/smarr/are-we-fast-yet
NBody
https://github.com/smarr/are-we-fast-yet/blob/master/benchmarks/Java/src/NBody.java
個別の最適化やヒューリスティックの向上がすべてのワークロードの改善に寄与するわけではなく、多くの場合、一部のワークロードではわずかにしか改善されません。しかし、ちりも積もれば山になるように、継続的に小さな変更の積み重ねが加わると、長期的には効果を生みます。以下は、昨年の19.3.0リリースと比較した20.3.0の進歩を示すグラフです。

昨年のパフォーマンスが、これらのワークロードでは最先端のものであり、ワールドクラスの結果を示していたことに注意してください。20.3がこれらの結果を改善したという事実が、パフォーマンスをさらに印象的なものにしています。
Native Image
GraalVM Native Imageは、クラウドデプロイメント、CLIツール、組み込みデバイスやモバイルデバイスへのデプロイメントをサポートする非常に汎用性の高い技術です。
20.3.0では、Native Imageはcontainer awarenessを改善しました。Linuxでは、プロセッサ数や利用可能なメモリサイズなどのリソース制限をcgroup V1とV2の設定から読み込みます。プロセッサ数は、コマンドラインオプション -XX:ActiveProcessorCount=
を使用してオーバーライドできます。
Java HotSpot VMとともにGraalVM Enterpriseで利用可能なG1ガベージコレクタは、Native Imageで生成されたネイティブ実行ファイルでもサポートされるようになりました。-H:+AllowVMInspection
をつけてビルドされた場合、G1はパフォーマンスカウンターもサポートします。これは、ビルド時に --gc=G1
という簡略化されたより説明的なオプションで有効にできます。
Community Editionでは分離コンパイルが可能になり、Truffleアプリケーションとランタイム・コンパイラが互いに分離されました。これにより、ガベージ・コレクションなどの相互干渉を減らすことでパフォーマンスが向上します。
アサーションの有効化・無効化のオプションで、パッケージ名とクラス名を指定する完全な構文がサポートされるようになりました。アサーションはイメージのビルド時に -ea
/ -da
/ -esa
/ -dsa
といったオプションを使って設定する必要があります。システムアサーションの定義が拡張され、JDK内のアサーションだけでなく、ガベージコレクタなどのようなSubstrate VMランタイムシステム内のアサーションも含まれるようになりました。
このリリースには、小さなパフォーマンスとメモリフットプリントの最適化も多数入っています。特に、型チェックの新しい実装により、イメージヒープ内の型データが少なくて済むようになったので、Class.isInstance
とClass.isAssignableFrom
のパフォーマンスが向上しました。
コミュニティとの共同作業のおかげで、基本的なデバッグ情報の生成がWindowsでも可能になりました。
どのリリースでもそうですが、GitHubで報告された多くのIssueを修正しました。注目すべき例を挙げると、いくつかのネイティブイメージの実行ファイルが UPX ユーティリティで正しく圧縮されない問題がありました。圧縮の割合は特定のプロジェクトによって異なりますが、多くの場合、マイクロサービスアプリケーションの例では60~70%小さい実行ファイルができあがります。
Native Image関連のClosed Issue
https://github.com/oracle/graal/issues?q=is%3Aissue+is%3Aclosed+label%3Anative-image+
Graal VM Native image UPX Compression #2830
https://github.com/oracle/graal/issues/2830
Language Implementation Framework (Truffle)
Truffle言語実装フレームワークは、GraalVM上で動作するすべての非JVMネイティブ言語を支えています。20.3.0では、Truffleの主要なテーマの1つとして、ウォームアップ(プログラムがいかに速くなるまでの時間を短縮するか)の改善に焦点を当てていました。ウォームアップに対処するための最も重要な変更点は3つありました。20.3.0 では、利用可能なプロセッサの数に応じて Truffleコンパイラ・スレッドを弾力的に割り当てることがデフォルトで可能になりました。これまでの1つまたは2つのコンパイラ・スレッドを使用する動作は、--engine.CompilerThreads=0
で明示的に有効にできます。その上で、GraalVM 20.3.0では、Host Graph CachingとMultiTier Compilationのウォームアップを向上させる2つの機能がデフォルトで有効になっています。
GraalVMがサポートする言語(JavaScript、Ruby、Python、R、その他LLVMビットコードを実行する言語)をお使いであれば、20.3.0をお試しください。ウォームアップが顕著に改善されます。
例えばJavaアプリケーションなどにこれらの言語を組み込んでいる場合、重要な改善が20.3.0に含まれています。例えば、polyglotなContext
実行割り込みをするために、Context.interrupt(Duration)
APIを追加しています。この割り込みは非破壊的なものであるため、polyglotなContextは今後の実行でも利用できます。
And GraalVM Enterpriseでは実験的なサンドボックスのリソース制限を導入しています。以下のようなオプションをご利用いただけます。
sandbox.MaxStatements=<long>
: ステートメントの最大個数を制限sandbox.MaxCPUTime=1000ms
: アプリケーション実行に費やすトータル最大CPU時間を制限sandbox.MaxThreads=<int>
: コンテキストが同時に利用できるスレッド数を制限
サンドボックスの制限については、今後の記事で詳しく説明します。
JavaScript
GraalVM 20.3.0でサポートされるNode.jsのバージョンは、12.18.4です。
JavaScriptでは、Nashorn 互換モードにも多くの改良が加えられました。
- 優先順位の低いlossy数、文字列からbooleanへの変換、数値からbooleanへの変換が可能に
- フィールド、getter/setterアクセス順序を修正しNashonに合わせた
HostAccess.Builder.allowImplementation
制限を尊重するよう、Java.extend
を修正
JavaScript の型を模倣する外部オブジェクトのための JavaScript プロトタイプを設定する機能は 20.3.0 でサポートされるようになりました。そのため、これを有効にするオプションは js.foreign-object-prototype
に改名されました。
Ruby
リリースごとに、TruffleRubyには数多くの互換性の問題やパフォーマンス改善が入っています。
Truffleがすべての言語にもたらすウォームアップの改善に注力する変更により、20.3.0ではRubyに種々のウォームアップの改善が含まれています。とりわけ、分割を大幅に減らし、より多くのオペレーションを呼び出しではなくインラインで行うようになりました。これにより、ピークパフォーマンスにより速く到達できるようになるはずです。
Python
GraalVMのPython実装の互換性は引き続き改善されています。20.3.0リリースでは、標準ライブラリの型とモジュール(complex
、byte
、bytearray
、特殊記述子のサブクラス化、型レイアウト、float
、ジェネレータ、モジュール、引数渡しにおける極稀なケース、文字列リテラルとエンコーディング、import
とimportlib
、decimal
、glob
、組み込みモジュール、json
、math
、演算子、numeric tower
、sys
、warning
、random
、f-strings
、struct
、itertools
、super
)のユニットテストを通過するための多くの修正が含まれています。
その上で、Pythonのバージョンが3.8.5にアップデートされました。コミュニティでの知名度が上がってきたこともあり、スタンドアロン版のgraalpython
もpyenv
経由でインストールできるようになりました。
LLVM bitcode runtime
パフォーマンスの向上とバグ修正に加え、GraalVM 20.3.0では、GraalVM LLVMランタイムでのコード共有がサポートされました。これにより、共通のビットコードライブラリのASTとコンパイル済みコードを、単一のエンジン内の複数のコンテキスト間で共有できます。
また、LLVMツールチェーンもバージョン10.0.0に更新されました。
Tools
20.3.0におけるGraalVM用ツールの大きな改善点は、新たなVSCode GraalVM extension for Javaです。これには、Javaプロジェクトでの作業を簡素化する以下のような機能が多く含まれています。
- Java シンタックスハイライト
- Java コード補完
- 統合されたJavaデバッガ
- GraalVM言語用の統合されたPolyglot デバッガ
また、新しいVS Code Micronaut extensionもあります。これはGraalVM extension for Javaを活用するだけでなく、Micronautアプリケーションの作業をシンプルにします。特に新しいMicronautプロジェクトの作成やMicronautアプリケーションのネイティブイメージの構築を支援します。
What do you want to see in GraalVM?
リリースのたびに、アプリケーションの動作を高速化し、新しい機会を提供し、開発プロセスをより効率的で楽しいものにする新機能を導入しています。私たちのプロジェクトロードマップ上には多くのものがありますが、どれが最も便利で、何がまだ不足しているのか、皆様からのご意見をお待ちしています。この開発者アンケートにご回答いただき、GraalVMをどのように改善・拡張すべきかをお聞かせください。また、あなたのチームやコミュニティでもご自由に共有してください – より多くのご意見をいただくことで、GraalVMをより良いものにしていきます。
これらはGraalVM 20.3.0で最も注目すべき改善点の一部に過ぎません。新機能や注目すべき機能の詳細については、リリースノートをお読みください。あなたが最も興味を持っているコンポーネントについては、変更ログが非常に貴重な情報源でしょう。
ダウンロードは、いつも通りGraalVM Community Edition 20.3.0とGraalVM Enterprise Edition 20.3.0がございます。
- GraalVM Community Edition
https://www.graalvm.org/downloads - GraalVM Enterprise Edition
https://www.oracle.com/downloads/graalvm-downloads.html