リリース・ノート
このページでは、リリース間のOracle GraalVM Enterprise Edition 22の変更点について説明します。GraalVM Enterpriseは複数のコンポーネントで構成され、変更点は個別にリストされています。リリース・ノートは、読みやすくするために日付とバージョン番号の降順にグループ化されています。
更新頻度の詳細は、GraalVM Enterpriseのバージョン・ロードマップを参照してください。
Oracle GraalVM Enterprise Edition 22.3.5
(2024-01-16)
これは、Oracle GraalVM Enterprise Edition 22.3.x用の2024年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次に示す注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.10+11 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.22+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- コンパイラの修正:
- ループの不変数および定数に再関連付けできるバイナリ算術演算が再編成されました。
IntegerLessThanNode
にキャストする前にコンパイラがスタンプをチェックするようになりました。- AArch64アーキテクチャのサポートが改善されました。
BranchOp
によるFarBranch
の生成を許可し、AArch64 HotSpot null定数コードの生成をより汎用的にしました。 - ネイティブ・イメージ最適化レベルがリファクタリングされました。無効化できる機能としてデッド・ファイ・サイクル検出を公開しました。
- 条件付き移動最適化コスト計算が改善されました。
int
範囲のstrideオーバーフローを処理することでループ展開の最適化が改善されました。checkcast
およびinstanceof
の生成中の明示的なnullチェック例外が削除されました。
- ネイティブ・イメージの修正:
- 到達可能性ハンドラ登録用の同期データ構造が有効になりました。
- Windows 11およびWindows Server 2022を認識するようにOS検出コードが更新されました。
- Truffleツールと言語の修正:
- TRegexのインストゥルメンテーションのサポートが改善されました。
- JSONパーサー・ライブラリorg.jsonがバージョン20231013にアップグレードされました。
- VMのシャットダウン時にエンジンをクローズしないようにする修正が追加されました。
- グローバル
PolyglotIsolate.Lazy#hostToGuestObjectReferences
をHSContext
ごとに変更しました。
Oracle GraalVM Enterprise Edition 22.3.4
(2023-10-17)
これは、Oracle GraalVM Enterprise Edition 22.3.x用の2023年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次に示す注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.9+11 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.21+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 基礎となるNode.jsをバージョン16.20.2にアップグレードしました。
- コンパイラの修正:
- インダクション変数として誤って検出された代替
Phi
を修正しました。 - macOS AArch64のコンパイルミスを修正しました。
- インダクション変数として誤って検出された代替
- ネイティブ・イメージの修正:
- Javaフライト・レコーダの定期チャンク・イベントのバグを修正します。
- Javaフライト・レコーダの定数プールIDを修正します。
- 非最終のJDKメソッドに、無停止の注釈を付けないでください
- 物理メモリー・サイズを積極的に初期化します。
- 外部コールに対して
exceptionTemp
を適切に設定します。
Oracle GraalVM Enterprise Edition 22.3.3
(2023-07-18)
これは、Oracle GraalVM Enterprise Edition 22.3.xの2023年7月のOracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次に示す注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.8+9 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.20+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- Graalコンパイラ: カウントされたストリップ・マイニングの最適化を更新し、オーバーフロー・ループをストリップ・マイニングしないようにしました。
- ネイティブ・イメージ: 到達可能性ハンドラを修正しました。
- ネイティブ・イメージ: 汎用配列シグネチャの登録を修正しました。
- Truffleフレームワーク: ポリグロット分離で常に渡されるデフォルトのタイムゾーンを修正しました。
Oracle GraalVM Enterprise Edition 22.3.2
(2023-04-18)
これは、Oracle GraalVM Enterprise Edition 22.3.xの2023年4月のOracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
ノート: JDK 19は、GraalVM Enterprise Edition 22.3.2ではサポートされていません。Java 20のリリースで、JDK 19.0.2 (GraalVM 22.3.2に含まれる)はセキュリティ・ベースラインを下回り、パッチ未適用の脆弱性が含まれる可能性があります。したがって、使用しないでください。GraalVM 22.3.xを引き続き使用する場合は、JDK 17に移行する必要があります。これにはアプリケーション・コードの変更が必要な場合があります。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.7+8 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.19+8 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- Node.jsをバージョン16.19.1にアップグレードしました。
Oracle GraalVM Enterprise Edition 22.3.1
(2023-01-17)
これは、GraalVM Enterprise 22.3.x対応の2023年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 11.0.18 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.6 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 19.0.2 (Java 19ベースのGraalVM Enterprise)。「Java SE 19リリース・ノート」を参照してください
- Node.jsがバージョン16.18.1に更新されました。
Oracle GraalVM Enterprise Edition 22.3.0
(2022-10-18)
- プラットフォームの更新
- Javaおよびコンパイラの更新
- ネイティブ・イメージ
- ポリグロット・ランタイム
- JavaScriptおよびNode.js
- Python
- Ruby
- R
- LLVMランタイム
- Java on Truffle
- WebAssembly
- ポリグロット埋込み
- Truffle言語およびツールの実装
プラットフォームの更新
22.3.0リリースは、年次リリース・トレインの最後の機能リリースであり、今後18か月間、バグおよび脆弱性の修正を含めてサポートされます。リリース・スケジュールは、「バージョン・ロードマップ」を参照してください。
- 実験的なJDK 19 GraalVMビルドをリリースしました。Graalコンパイラ、ネイティブ・イメージ、およびEspresso (Java on Truffle)を除くすべてのGraalVM言語およびツールが含まれています。これらのビルドで、ユーザーが最新のJDK 18およびJDK 19の機能(仮想スレッド、単純なWebサーバー、構造化並行性など)を利用できます。JDK 19のサポートは今後のリリースで使用可能になる予定です。#4957および#5063を参照してください。
-
GraalVMネイティブ・イメージのインストール可能ファイル・サイズが約80MB削減されました。LLVMバックエンドが個別の
native-image-llvm-backend
コンポーネントとして出荷されるようになりました(デフォルトでnative-image
とともに出荷されることはなくなりました)。 - GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 11.0.17 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.5 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 19.0.1 (Java 19ベースのGraalVM Community)。「Java SE 19リリース・ノート」を参照してください
Javaおよびコンパイラの更新
- JDK 18およびJDK 19の機能(JDK 19ビルドに基づくGraalVMの仮想スレッド、単純なWebサーバー、構造化並行性など)のサポートを追加しました。
libgraal
コンパイラ・スレッドごとに1つの分離を使用して、JITコンパイルの分離を改善しました。これにより、コンパイラ・スレッド間のすべてのGC干渉が回避され、コンパイル中のGCの一時停止が減少します。これで一般的にコンパイルの速度が上がります。DaCapoベンチマークではバイトコード/秒で測定されるコンパイル速度が少なくとも2倍になり、fop
やpmd
など個々のベンチマークでは速度が3倍になります。古いモードを有効にするには、コマンドラインに-XX:JVMCINativeLibraryThreadFraction=0.66 -XX:JVMCIThreadsPerNativeLibraryRuntime=0
を追加します。libgraal
専用のネイティブ・イメージGCポリシーを追加しました。これにより、Eden領域が積極的に調整されRSSメモリー使用量が最小化されます。- Graalコンパイラ(
libgraal
)を最上位層コンパイラとして使用するイメージを生成するように、jlink
の動作を改善しました。GraalVMから生成されるjlink
イメージはデフォルトでJVMCIを使用します。また、java -version
出力はGraalVMブランドです。 - コンパイラ最適化の
StripMineCountedLoops
およびEarlyGVN
がデフォルトで有効になりました。これらは、最初は-Dgraal.StripMineCountedLoops=true
オプションおよび-Dgraal.EarlyGVN=true
オプションとして22.2リリースに導入されました。 - 整数の最小/最大演算のループ・ベクトル化を実装しました。この実装では、すべての整数サイズ、手書きの最小/最大パターン(
Math.min
/Math.max
だけではなくx > y ? x : y
など)、符号なしの最小/最大、折畳み型ループ(配列の最小要素や最大要素の計算など)が処理されます。 - 非推奨のJMX
HotSpotGraalRuntime
管理Beanをlibgraal
とjargraal
の両方から削除しました。
ネイティブ・イメージ
- JDK 19およびOpenJDK Project Loom Virtual Threads (JEP 425)のサポートを追加しました。高スループット軽量同時実行性の仮想スレッドはシリアルGCとG1 GCの両方でサポートされます。仮想スレッドはJDK 19のプレビュー機能であるため、GraalVMネイティブ・イメージのプレビュー機能でもあります。これらは新しいオプション
--enable-preview
で有効にできます。仮想スレッドは、JDK 11およびJDK 17に基づくGraalVMでは使用できません。また、Truffle言語(JavaScript、Pythonなど)を含むネイティブ実行可能ファイルでもまだ使用できません。詳細は、#4920を参照してください。 - ネイティブ・イメージAPの欠落部分(アプリケーションとフレームワークが
native-image
ジェネレータの内部にアクセスする場合の機能)を識別して追加しました。これには、機能インタフェース・クラスのJNI、リソース、プロキシおよびシリアライズのクラスをプログラミングで登録するための新しいパブリックAPIや、メソッド置換の注釈のGraal SDKへの移動が含まれます。これらの注釈はサポートされているAPIではありませんが、実際的な理由により、native-image
ジェネレータに依存しなくても使用できます。このリリースで、native-image
内部は引き続きMaven Centralに公開されますが、これは将来のリリースで停止されます。したがって、このリリース以降では、すべてのユーザーがGraal SDKのみを使用することをお薦めします。それができない場合には、その他の欠落しているAPIをGitHubで報告してください。 - ネイティブ・イメージで使用可能なG1 GCバージョンをJDK 19に更新しました。このG1バージョンは、JDK 11およびJDK 17に基づくネイティブ実行可能ファイルでも使用されます。また、G1 GCは、
musl
Cライブラリと静的にリンクされたネイティブ実行可能ファイルで使用できるようになりました。 RuntimeResourceAccess#addResource(Module module, String resourcePath, byte[] resource)
APIメソッドを追加しました。これでリソースをネイティブ実行可能ファイルに注入できるようになります。
デバッグおよびモニタリング・エクスペリエンスの改善:
- メモリー使用量とメモリー・リークを特定するようにデバッグ・エクスペリエンスを改善しました(Red Hatによって提供)。たとえば、
perf report
は、perf record
セッション中にサンプリングしたコード・アドレスをJavaメソッドと関連付けることができ、そのメソッドのDWARF導出メソッド名を出力ヒストグラムに示すことができます。perf
およびvalgrind
を使用するための特別な考慮事項の詳細は、ドキュメントを参照してください。 --enable-monitoring=<all,heapdump,jfr,jvmstat>
オプションを追加しました。ネイティブ実行可能ファイルに含まれるモニタリング機能を細かく制御できるようになります。今後、古いオプション-H:±AllowVMInspection
は使用しないでください。新しいオプションは、サポートされているAPIの一部です。- GraalVM Community Editionにjvmstatの初期サポートを追加しました。以前は、これはGraalVM Enterprise Editionでのみ使用可能でした。
- JFRイベント、
JavaMonitorEnter
、JavaMonitorWait
およびThreadSleep
のサポートを追加しました(Red Hatによって提供)。 - サポートされているAPIにオプション
--enable-sbom
を追加しました。今後、古い非APIオプション-H:IncludeSBOM
は使用しないでください。
ビルド出力の機能拡張:
- ビルド出力情報をJSON形式でエクスポートする、実験的な
-H:BuildOutputJSONFile=<file.json>
オプションを導入しました。また、古いビルド出力スタイルと-H:±BuildOutputUseNewStyle
オプションが削除されます。 - ビルド出力を行わない
--silent
オプションを追加しました。
GraalVMネイティブ・イメージ・エコシステムの更新:
- Spring Boot 3.0.0-M5には、改善されたAOT処理およびGraalVMネイティブ・イメージ・サポートが含まれます。
- JUnitフレームワーク5.9.1によって、
@EnabledInNativeImage
および@DisabledInNativeImage
注釈が導入され、ユーザーがGraalVMネイティブ実行可能ファイルのテストを組込み/除外できるようになりました。 - Micronautによって、GraalVMネイティブ・イメージのサポートを備えた新しいリソースのテスト機能が追加されました。
- IntelliJ IDEA 2022.2によって、GraalVMネイティブ・イメージ実行可能ファイルをデバッグするための実験的なサポートが追加されました。
JDK 19サポートの既知の問題
java.io.Console
APIがJDK 19では正常に動作しないことに注意してください。Console
が使用可能かどうかという情報がビルド時に正しく計算されません。つまり、端末のないCIシステム上でネイティブ実行可能ファイルをビルドしたとすると、その実行可能ファイルは、端末内で実行しているときでさえConsole
を使用できません。これは、GraalVMに付属しているTruffle言語ランチャにも影響します。
プロジェクトの変更ログをGitHubで参照できます。
ポリグロット・ランタイム
- スニペットの実行中にスローされる
IllegalArgumentException
を提供するSnippetRun#getException()
メソッドを導入しました。IllegalArgumentException
がPolyglotException
に変換されてから返されます。
更新の完全なリストは、変更ログを参照してください。
JavaScriptおよびNode.js
- WebAssembly複数値提案を実装して、複数値をWebAssemblyに返すためのサポートを追加しました。
- Node.jsをバージョン16.16.0に更新しました。Node 16.xがサポート期限を迎えるとGraalVM Node.jsのサポートは終了します(「Node.jsリリース・スケジュール」を参照)。
- ECMA-402 Internationalization APIがデフォルトで有効になりました。
--js.intl-402=false
オプションを使用すると無効にできます。 - 実験的なオプション
--js.unhandled-rejections=handler
を追加しました。カスタム・コールバックを使用して未処理の回答拒否を追跡できるようになります。 - デコレータ(ステージ3)提案を実装しました。
プロジェクトの変更ログをGitHubで参照できます。
Python
- プロジェクト全体の名前をGraalPythonからGraalPyに変更し、ランチャーを
graalpython
からgraalpy
に変更しました。この変更により、python
およびpython3
からgraalpy
へのシンボリック・リンクが含まれるようにGraalVMのランチャも更新され、他のツールとの統合が向上しています。
パフォーマンスの向上:
- デフォルトで新しいバイトコード・インタプリタに切り替わりました。この変更により、起動パフォーマンスとメモリー・フットプリントが改善する一方で、優れたJITコンパイル・パフォーマンスが維持されます。たとえば、REPLでの
pip install <package>
またはimport <package>
の実行のような開発時のアクションは、実行速度が20-25%速くなり、使用メモリーが平均25%削減されます。
互換性の向上:
- CPythonの新PEG文法定義から生成された新しいパーサーに切り替わりました。互換性が高くなり、
ast
モジュールを実装できます。 - トレースAPI (
sys.settrace
)のサポートを追加しました。pdb
および関連ツールがGraalPyで機能するようになりました。 - プロファイルAPI (
sys.setprofile
)のサポートを追加しました。profile
パッケージが機能するようになりました。 - 既知のパッケージの最適なバージョンを自動的に選択するように
pip
を更新しました。pip install pandas
を使用できます。pip
が、GraalPy継続的インテグレーションでテストされたpandas
とnumpy
のバージョンを選択します。 - Flaskのサポートを追加しました。
- 仮想環境の完全なサポートのためにPEP 405を実装しました。これによって、PyCharmまたは多くのプロジェクトの継続的インテグレーション(CI)ジョブで使用される、
virtualenv
パッケージおよびtox
の問題が修正されます。
更新の完全なリストは、変更ログを参照してください。
Ruby
新機能:
- 外部文字列にRuby Stringのすべてのメソッドが含まれるようになりました。これらは
#frozen?
UTF-8 Ruby Stringsとして扱われます。 - 実行時にJARパスを追加するために
Java.add_to_classpath
メソッドを追加しました。JVMモードで(--jvm
)で実行中にユーザーがJVMクラスパスを変更できるようになります。たとえば、バンドラで管理されるRuby gemがJavaライブラリをロードして、クラスパスそのものを更新できます。詳細は、#2693を参照してください。 - Ruby 3.1のハッシュ短縮およびパンニング構文および匿名ブロック転送構文のサポートを追加しました。
Polyglot::InnerContext.new
にキーワード引数(languages
、language_options
、inherit_all_access
、code_sharing
)を追加しました。
パフォーマンス関連の向上:
- 効率的なホスト・インライン化のために最適化することで、インタプリタのパフォーマンスを改善しました。
- 単純なIO待機で
select
のかわりにpoll
を使用してオーバーヘッドを削減しました(#1584)。 - Javaとの相互運用性を改善しました。相互運用境界でのJava文字列とRuby文字列間の変換は不要になりました。
互換性の更新:
- 外部文字列に対する
#dup
および#clone
のサポートを追加しました。 - CRubyにおけるようにインスタンスおよびクラス変数を反復処理するために
rb_ivar_foreach
を実装しました。詳細は、#2701を参照してください。
変更点:
Truffle::Interop.{import_without_conversion,export_without_conversion}
を削除しました。かわりにPolyglot.{import,export}
を使用します。Truffle::Interop.members_without_conversion
を削除しました。かわりにTruffle::Interop.members
を使用します。
変更の完全なリストは、changelogを参照してください。
R
- グローバル・ネイティブ変数APIを実装して、複数のRコンテキストを使用する際のRグラフィック分離を改善しました。現在、ユーザーは2つのRコンテキストのネイティブ・パッケージを同時に使用できます。このAPIは、
FASTR_GlobalVarAlloc
のようにFASTR_GlobalVar
接頭辞が名前に付いたいくつかのアップコールで構成されます。現在、グリッドとグラフィックスの組込みパッケージのみがグローバル・ネイティブ変数APIを使用するようにリファクタされています。 - dplyr 1.0.3の部分的なサポートを追加しました。ユーザーが、メモリーの内外でオブジェクトなどのデータ・フレームを操作できるようなります。現在、
SET_PRCODE
、SET_PRENV
およびSET_PRVALUE
アップコールが実装されています。
プロジェクトの変更ログをGitHubで参照できます。
LLVMランタイム
- LLVMツールチェーンをバージョン14.0.6に更新しました。
- 実験的なサポートの下でWindows用のLLVM runtime for GraalVM Community Editionをリリースしました。
- 浮動小数点数のx86拡張精度のサポートを改善しました。x86アーキテクチャでネイティブ関数(
libc
など)をlong double
引数を使用してコールできるようになりました。math.h
関数のlong double
バリアントが、完全な精度を使用するようになりました。以前は、double
算術を使用して実装されていました。
Java on Truffle (Espresso)
- ホストと組込みゲストコンテキスト間の1:1マッピング用のポリグロット自動インタフェース・タイプ・マッピングを追加しました。
- 相互運用性を改善しました。EspressoからEspressoへの変換が検出されたときに、Espressoからプリミティブへの変換が発生します。後者は失敗します。
- Espressoオブジェクトのメソッドを読み取って、新しい相互運用実行可能オブジェクト
isExecutable
を取得できるようになりました。 - メイン・スレッドで捕捉されない例外の終了ステータスを修正しました。
java.UseBindingsLoader=true
の場合にaddPath
呼出し可能メンバーをEspressoバインディング(polyglot.getBindings("espresso")
、クラスのロードが発生するエントリ・ポイント)に追加しました。これによって、バインディングに関連付けられたクラスローダーに新しいパスを追加できるようになります。これはTruffle TCKを通過する際のEspressoの動作を制御しやすくするために必要な追加でした。
プロジェクトの変更ログをGitHubで参照できます。
WebAssembly
- 複数値の提案を実装しました。オプション
--wasm.MultiValue=false
を使用すると無効にできます。 - Sign-Extension-Ops変換およびSaturating-Float-To-Int変換がデフォルトで有効になりました。
プロジェクトの変更ログをGitHubで参照できます。
ポリグロット埋込み
- フィールド値をインターセプトして定数畳込みを行うためのより汎用的なメカニズムとしてFieldValueTransformer APIを実装しました(種類が
Custom
の既存のRecomputeFieldValue
を置き換えます)。特定のフィールドの値を変更できるようになります(フィールドがBeforeAnalysisAccess#registerFieldValueTransformer
によってトランスフォーマとしてマークされている場合)。静的分析によってフィールドにアクセスできる前に、トランスフォーマを登録しておく必要があります。また、フィールドごとにトランスフォーマは1つのみです。ビルド時に、フィールド値トランスフォーマはイメージ・ヒープのフィールドの値を示します。トランスフォーマを使用しない場合、イメージ・ヒープのフィールドの値がホストと同じになります。このAPIは、Springとの互換性のために必要です。 Context.Builder.allowInnerContextOptions(boolean)
を追加しました。コンテキストが内部コンテキストを生成したり、言語オプションを変更およびオーバーライドしたりできるようになります。内部コンテキストは、初期コンテキストとコードを共有しなくなりました。この権限のデフォルト値は、Context.Builder.allowAllPrivilages(boolean)
が設定されているかどうかに基づいて決定されます。セキュリティが重要なシナリオでは、この権限を有効にしないでください。- ネイティブ・イメージの厳密な内部注釈クラス(
@Alias
、@TargetClass
、@Substitute
など)をcom.oracle.svm.core.annotate
からorg.graalvm.sdk
モジュールに移動しました。
変更の完全なリストは、changelogを参照してください。
Truffle言語およびツールの実装
- コード・サイズを小さくするためにホスト・インライン化ヒューリスティックをチューニングしました。ホスト・インライン化の新しいチューニング・ガイドは、ドキュメントを参照してください。
- 新しい機能を
TruffleContext
に追加しました。内部コンテキストのコード共有を強制または拒否するTruffleContext.Builder.forceSharing(Boolean)
など多数あります。完全な一覧は、「Truffleプロジェクトの変更ログ」を参照してください。 FrameSlot
やCompilerOptions
など、いくつかの非推奨コアAPIを削除しました。完全な一覧は、「Truffleプロジェクトの変更ログ」を参照してください。- インストゥルメント・タスクをバックグラウンドで処理する新しいスレッドを作成するために、
TruffleInstrument.Env#createSystemThread
およびTruffleLanguage.Env#createSystemThread
を追加しました。 copyStatic
、clearStatic
およびswap...Static
の追加メソッドを静的フレームAPIに追加しました。- アサーションが有効なときに静的フレーム・アクセスが検証されるかどうかのチェックを追加しました。読み込んだスロットの型が書き込まれた型と異なる場合、
AssertionError
が発生します。 TruffleLanguage.Env.newContextBuilder()
メソッドを非推奨にして、新しいメソッドTruffleLanguage.Env.newInnerContextBuilder(String...)
で置き換えました。新しいメソッドは親コンテキストからすべての権限を継承しなくなります。また、デフォルトでは作成者コンテキストを初期化しなくなります。新しいメソッドでは、ポリグロット埋込みAPIと同様に、許可される言語を内部コンテキストに設定することもできます。- アプリケーション引数の設定の動作を変更しました。内部コンテキストは外部コンテキストからアプリケーション引数を継承しなくなりました。現在、
TruffleContext.Builder.arguments(String, String[])
を使用して内部コンテキストのアプリケーション引数を明示的に設定できます。 - 内部コンテキストの動作を変更しました。ポリグロット埋込み機能が外部コンテキストに対して
Context.Builder.useSystemExit(boolean)
でシステム終了を指定した場合でも、内部コンテキストは終了時にシステム終了を使用しなくなりました。 - RootNode.getParentFrameDescriptorメソッドを導入しました。ホット・メソッドの字句スコープの親を識別し、それらを先にコンパイルすることがサポートされます。
更新の完全なリストは、変更ログを参照してください。
Oracle GraalVM Enterprise Edition 22.2.0.1
(2022-09-20)
これは、次を含むGraalVM Enterprise 22.2.0ブランチのパッチ・リリースです:
- プラットフォームの更新:
- 11.0.16.1 (Java 11ベースのGraalVM Enterprise)
- 17.0.4.1 (Java 17ベースのGraalVM Enterprise)
ResourceBundles
がブート・モジュール・レイヤーにない場合のClassLoaderSupportImpl#getResourceBundle
での例外処理。- Javaプラットフォーム・モジュール・システムのネイティブ・イメージ・サポートの改善:
native-image
ジェネレータに--list-module
オプションを追加して、解決されたモジュールが終了した場所を確認します。
Oracle GraalVM Enterprise Edition 22.2.0
(2022-07-19)
- プラットフォームの更新
- Javaおよびコンパイラの更新
- ネイティブ・イメージ
- ポリグロット・ランタイム
- JavaScript
- Ruby
- Python
- R
- LLVMランタイム
- Java on Truffle
- WebAssembly
- ポリグロット埋込み
- Truffle言語およびツールの実装
- ツール
プラットフォームの更新
- ベース・バイナリのサイズを最大約2倍に削減することで、GraalVMパッケージ化の操作性が向上しました。JavaScript、LLVMランタイムおよびVisualVMは、メイン・パッケージから切り離され、個別のインストール可能なコンポーネントとしてリリースされるようになりました。たとえば、GraalVM Enterprise macOSディストリビューションのパッケージ・サイズが最大490MBから最大270MBに減少しました。これにより、必要なもののみのサポートを追加した場合、GraalVMは、同じRPMのような操作性を提供するモジュラになります。
- 必要なランタイム・コンポーネント(Substrate VM)および静的ライブラリ(Substrate VMで使用)がインストール可能なネイティブ・イメージの一部になっているため、ネイティブ・イメージ・コンポーネント・サイズが増加しました。
- Apple Silicon (AArch64アーキテクチャ)のGraalVM Enterpriseディストリビューションをリリースしました。サポートは試験段階です。オプションで、ネイティブ・イメージ、LLVMツールチェーン、Truffle上のJava、およびJavaScript、Ruby、Webassemblyの言語ランタイムをインストールできます。
-
GraalVM Enterpriseは、一部の古いLinux AMD64ディストリビューションでは実行されなくなります。現在は、
glibc
2.17 (2.12ではなく)に対してビルドされており、その結果、Oracle Linux 6またはその他のRHEL 6の派生では実行できません。 - GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 11.0.16 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.4 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Javaおよびコンパイラの更新
-
カウント・ループに対する新しいストリップ・マイニングの最適化が強化されました。最適化を有効にするには、
-Dgraal.StripMineCountedLoops=true
オプションを使用します。ストリップ・マイニングの最適化では、1つの長時間実行ループを、内部本体が制限時間だけ実行されるネストされたループに変換します。外側のループにセーフポイントを配置して、セーフポイント・ポーリングのオーバーヘッドを減らすことができます。外側のループ・ストライドに適切な値を選択することで、セーフポイントまでの適切な待機時間が確保されます。後者は、ZGCやShenandoahなどの休止時間の短いコレクタにとって特に重要です。たとえば、次のループがあるとします:int checksum = 0; for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { checksum += i; // safepoint_poll }
次のようになります:
int checksum = 0; for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE - 1000; i += 1000) { for (int j = i; j < i + 1000; j++) { checksum += j; } // safepoint_poll } for (int i = Integer.MAX_VALUE - 1000; i < Integer.MAX_VALUE; i++) { checksum += i; // safepoint_poll }
この最適化により、Truffleゲスト言語のセーフポイントのレイテンシが追加されます。たとえば、新しいストリップ・マイニングの最適化では、割当てを行うカウント・ループからHotSpotのセーフポイントが排除されます(HotSpotの割当ての低速パスにはセーフポイントがあります)。ただし、この割当て関連のセーフポイントは、Truffleのセーフポイントをトリガーしません。したがって、Truffleのセーフポイントのレイテンシは非常に長くなる可能性があります。この場合、新しいストリップ・マイニングの最適化では、このようなループをストリップに分解し、ストリップごとに1回、Truffleセーフポイントのポーリングを発行できます。
-
コンパイル・パイプラインの早い段階で除算ノードの浮動およびグローバル値の番号付けが有効になりました(トラップされないことがわかっている場合)。つまり、定数除数がゼロ除算例外をスローできないことが判明した場合、定数による除算演算を共通化してループの外に移動させることができます。#3866を参照してください。
-
コンパイル・パイプラインの早い段階で固定ノードのグローバル値の番号付けの最適化が導入されました。デフォルトでは無効になっていますが、
-Dgraal.EarlyGVN=true
で有効にできます。この最適化により、複雑なオブジェクト割当てを含む定数ループを最適化するために、複雑な部分エスケープ分析および展開の最適化を必要とするワークロードが改善されます。また、この最適化により、ネイティブ・イメージのビルド時間が短縮され(コンパイル・パイプラインの早い段階でグラフ・サイズを縮小する)、さらに多くのメモリー操作を折りたたむことによって、生成されたネイティブ実行可能ファイル自体が高速化されます。
ネイティブ・イメージ
- GraalVMネイティブ・イメージとサード・パーティ・ライブラリの互換性が強化されました。Oracle GraalVMチームは、Spring、MicronautおよびQuarkusチームとともに、GitHubリポジトリGraalVM到達可能性メタデータ・リポジトリを作成しました。これは、デフォルトでGraalVMネイティブ・イメージをサポートしないライブラリの構成(到達可能性メタデータ)を提供する集中管理された場所です。サポートは明示的に有効にする必要があります。たとえば、Gradleでは、次のものを使用してこのリポジトリを有効にできます:
graalvmNative { metadataRepository { enabled = true } }
GraalVM到達可能性メタデータ・リポジトリを使用すると、ユーザーは、Javaエコシステムで最も一般的なライブラリの到達可能性メタデータを共有および再利用できます。詳細は、ドキュメントを確認してください。
-
native-image
ジェネレータは、デフォルトでモジュール・パスで実行されるようになりました。これは、モジュールベースのクリーンなジェネレータを使用してモジュールベースのアプリケーションをサポートするための長期的な取組みの一部です。モジュール・システムは、デフォルトでnative-image
ジェネレータの内部への直接アクセスを防止します。アプリケーションおよびフレームワークは、通常のモジュール・システムのコマンドライン・オプションを使用して内部を再度開くためのコマンドライン引数を引き続き指定できます。現時点では、native-image
ジェネレータを実行する古いモードは、環境変数USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM=false
を設定することで有効にできます(ただし、このモードは将来のリリースで代替機能なしで削除されることに注意してください)。 -
メモリー・フットプリントを削減するために、
native-image
ジェネレータの多くの内部データ構造が改善されました。これにより、クラウドベースのビルド・サービス、GitHubアクション、Dockerコンテナなどのメモリー制約環境で実行すると、ネイティブ・イメージのビルドがより堅牢になります。現在、大規模なアプリケーションの多くは、native-image
ジェネレータで使用可能な2GBのJavaヒープ・サイズを使用して正常にビルドされています。 -
ソフトウェア部品表(SBOM)のサポートが追加されました。
native-image
ジェネレータでは、脆弱性スキャナを支援するために、オプションでSBOMをネイティブ実行可能ファイルに含めることができます。現在、CycloneDX形式がサポートされています。ユーザーは、コンパイル時に-H:IncludeSBOM=cyclonedx
オプションを使用して、CycloneDX SBOMをネイティブ実行可能ファイルに埋め込むことができます。圧縮されたSBOMを実行ファイルに埋め込んだ後、$JAVA_HOME/bin/native-image-inspect --sbom <path_to_binary>
コマンドでネイティブ・イメージ検査ツールを使用して、圧縮されたSBOMを抽出できます。詳細について、ドキュメントを確認してください。GraalVM Enterpriseのみ -
文字列連結操作(
StringBuilder
操作を含む)の新しい最適化が追加され、連結時に一時メモリー・バッファが排除されます。GraalVM Enterpriseのみ -
イメージ実行時にヒープ・ダンプがGraalVM Community Editionでサポートされるようになりました。また、ネイティブ実行可能ファイルの初期イメージ・ヒープをダンプするために、新しい実行時オプション
-XX:+DumpHeapAndExit
が導入されました。ネイティブ実行可能ファイルの初期ヒープをダンプする方法に関するドキュメントを確認してください。 -
Linuxでのデバッグ・サポートの改善: Dwarf情報には、パラメータおよびローカル変数(Red Hatによって提供)に関する情報が含まれるようになりました。
-
特定のネイティブ・イメージ・オプションは、コマンドラインでのみ指定でき、native- image.propertiesファイルでは指定できなくなります。これらのオプションは他のオプションよりも先に処理されるため、コマンドライン・ファイルとnative- image.propertiesファイルの両方から得られる他のすべてのオプションを正しく事前構成できます。影響を受けるオプションは、
--exclude-config
、--configurations-path
、--debug-attach
、--diagnostics-mode
、およびヘルプ・メッセージを出力するためのすべてのオプションです。 -
メモリー不足の最初のエラーでネイティブ実行可能ファイルの実行を中止する新しい実行時オプション
-XX:+ExitOnOutOfMemoryError
が追加されました。 -
イメージ実行時に
OperatingSystemMXBean
のほとんどのメソッドのサポートが追加されました。 - 注釈クラスは、イメージのビルド時に強制的に初期化されなくなります。他のクラスと同様に、注釈クラスは、対応するコマンドライン・オプション(
--initialize-at-build-time
または--initialize-at-run-time
)または機能APIを使用して、ビルド時または実行時に初期化できるようになりました。これにより、注釈で使用される非注釈クラスなど、注釈の推移的な依存性の問題が修正されます。ネイティブ・イメージのクラスの初期化を参照してください。
ポリグロット・ランタイム
- 20-30パーセントのインタプリタ専用パフォーマンスおよびGraalVMでサポートされている言語のウォームアップを改善する更新が導入されました。
- Truffleコンパイル間でエンコードされたグラフをキャッシュして部分評価を高速化するためのサポートが
libgraal
に追加されました。キャッシュはデフォルトで有効になっており、--engine.EncodedGraphCache
オプションで有効または無効にできます。この更新により、HotSpotのコンパイル時間が短縮されます。 - Truffleインタプリタ・ホスト・コンパイル用に新しいドメイン固有のインライン化フェーズが実装され、GraalVMネイティブ・イメージのインタプリタ・パフォーマンスが向上します。詳細は、インタプリタJavaコードのホスト・コンパイルのリファレンス・マニュアルを参照してください。
更新の完全なリストは、変更ログを参照してください。
JavaScript
- JavaScriptサポートは、ベースGraalVMインストールから切り離され、
gu install js
コマンドを使用して簡単に追加できるようになりました。 - JavaとのJavaScriptの相互運用性の向上: 明示的にオフにしないかぎり、外部オブジェクトはデフォルトでJavaScriptプロトタイプを割り当てられるようになりました。この機能は、以前は試験段階のオプション
js.foreign-object-prototype
の背後で利用できましたが、現在はデフォルトになりました。以前は、JavaScriptコードでJava配列などの外部オブジェクトを使用する場合は、索引演算子[]
を使用してアクセスできます。ただし、配列にはArray.prototype
がないため、indexOf
やsort
などのメソッドを簡単にコールできませんでした。この変更により、外部オブジェクトに適切なJavaScriptプロトタイプが割り当てられ、通常のJavaScript関数を使用して操作できます。これにより、通常のJavaまたはGraalVMポリグロットAPIユーザーの柔軟性が向上します。 - GraalVM JavaScriptの一時仕様の実装が拡張され、日時を操作するための標準オブジェクトおよび関数が提供されます。仕様の変更は継続的に採用されます。一時オブジェクトは、
asDate()
などの値APIのメソッドを使用して、必要に応じて互換性のあるJavaオブジェクトに変換できるようになりました。逆に、Java一時オブジェクトを提供し、それらをJavaScript一時メソッドとともに使用するという方向も、将来のリリースで計画されています。
プロジェクトのchangelogを参照してください。
Ruby
- macOS (Apple Silicon)用AArch64ディストリビューションのサポートが追加されました。
openssl
gemを更新して、OpenSSL 3.0.0のサポートが追加されました。- Ruby 3.0.3に更新されました。3つのCVEはTruffleRubyには影響せず、
stdlib
およびgemの更新をもたらすためのものです。 - GraalVMでRubyのパフォーマンスを向上させるいくつかの変更を実装しました:
- パフォーマンス向上のために
Float#to_s
を再実装しました。 - Cオブジェクト・フリー関数およびその他のファイナライザをより軽量にすることで、参照処理が更新されました。
- 内部文字列の
RSTRING_PTR
のパフォーマンスが向上しました。 rb_scan_args_kw
で使用される定数引数フォーマットのキャッシュを有効にしました。
- パフォーマンス向上のために
- CRuby 3.2との互換性の向上:
-Werror=implicit-function-declaration
は、C拡張機能のコンパイルに使用され、関数が見つからない場合により明確かつ早期に失敗するようになりました。
変更の完全なリストは、changelogを参照してください。
Python
- HPyバージョン0.0.4に更新され、Kiwiの終了したHPyポート、およびMatplotlibとNumPyの進行中ポートのサポートが追加されました。
- 起動を高速化し、インタプリタのパフォーマンスを向上させるための試験段階のバイトコード・インタプリタが追加されました。
--python.EnableBytecodeInterpreter
オプションを使用すると、以前のASTインタプリタまたは新しいバイトコード・インタプリタのいずれかを切り替えることができます。
プロジェクトの変更ログをGitHubで参照できます。
R
SET_GROWABLE_BIT
およびIS_GROWABLE
C API関数を実装しました。これにより、cpp11 0.2.6パッケージのインストールが修正されます。- ネイティブ・パッケージのリストにakimaパッケージが追加されたため、ネイティブ・バックエンドによってデフォルトでロードされます。
プロジェクトの変更ログをGitHubで参照できます。
LLVMランタイム
- LLVMランタイムは、ベースGraalVMインストールから切り離され、
gu install llvm
コマンドを使用して簡単に追加できるようになりました。 - LLVMツールチェーンがバージョン14.0.3に更新されました。
- macOS (Apple Silicon)用AArch64ディストリビューションのサポートが追加されました。
- POSIXスレッド、
pthreads
、管理対象実行モードのサポートが改善されました。このモードでは、ネイティブ・コードを呼び出したり、ネイティブ・メモリーにアクセスすることはできません。
Java on Truffle
- macOS (Apple Silicon)用AArch64ディストリビューションのサポートが追加されました。
- クラス再定義の改善: 列挙定数の追加のサポートが追加されました。これにより、デバッグ・セッションでの実行時にクラスを変更する際に、HotSwap機能がより強力になります。Java on Truffleでの拡張ホットスワップ機能のガイドを参照してください。
- 新しいクラス階層分析をデフォルトで有効にします。新しいクラスがロードされると進化する、ゲスト・コード内のクラス階層に関する情報が提供されます。
WebAssembly
- このリリースでは、ベンチマークに基づいて、GraalVM WebAssembly実装のパフォーマンスが大幅に向上しました:
- 内部ASTメモリー・フットプリントの改善 3.18倍
- ピーク・パフォーマンスの向上 1.24倍
ポリグロット埋込み
- ネイティブ・ランチャまたはライブラリ内の
Engine
またはContext
ごとにnative-image
分離を生成する機能が追加されました。この機能は、以前はJVMデプロイメントでのみサポートされていました。GraalVM Enterpriseのみ - メタ・オブジェクト(Javaクラスのスーパークラスや実装済インタフェースなど)の親の階層を参照できる
Value.hasMetaParents()
およびValue.getMetaParents()
メソッドが追加されました。 HostAccess.Builder.allowAccessInheritance
で、インタフェースまたはスーパークラスで明示的にエクスポートされたメソッドに対するアクセスを継承するものと、(たとえば@HostAccess.Export
を介して)明示的に検証されたメソッド実装のみに対するアクセスを継承するものが追加されました。java.util.List
にマップされるポリグロット値のList#add
サポートが追加されました。
変更の完全なリストは、changelogを参照してください。
Truffle言語およびツールの実装
- 新しい静的APIが
com.oracle.truffle.api.frame.Frame
に追加されました:- 索引ベースのスロット用に、
FrameSlotKind
に新しい静的オプションが実装されました。この種類を使用するフレーム・スロットは、後で別の種類に変更できません。静的フレーム・スロットは、1つのプリミティブ値と1つのオブジェクト値を同時に保持できます。静的フレーム・スロットは、フレーム・スロット内の変数の型が前もって認識されており、型チェックを必要としない状況(静的型付け言語など)を対象としています。 - 静的フレーム・スロットは、フレーム・スロット内の変数の型が前もって認識されており、型チェックを必要としない状況(静的型付け言語など)を対象としています。
- 索引ベースのスロット用に、
- 静的オブジェクト・モデルでは、GraalVMネイティブ・イメージでもフィールドベースのストレージの予備のサポートが提供されます。
- ログ・レベル5のTruffle IGVダンプ(
-Dgraal.Dump=Truffle:5
)では、完全に部分評価された各メソッドの後にグラフがダンプされるようになりました。これにより、部分評価中にのみ表示される問題のデバッグが可能になります。
更新の完全なリストは、変更ログを参照してください。
ツール
- GraalVM for JavaのVS Code拡張機能により、Windowsでのネイティブ・イメージのビルドが改善されました。現在、Windows 10の
.\gradlew nativeBuild
は、x64ネイティブ・ツール・コマンド・プロンプト内で実行されます。 - GraalVMアップデータは、
available
、list
およびinfo
コマンドのJSON出力を生成できるようになりました。これにより、GraalVM for JavaのVS Code拡張機能などの他のツールでプログラムによって使用しやすくなります。
Oracle GraalVM Enterprise Edition 22.1.0
(2022-04-19)
- プラットフォームの更新
- Javaおよびコンパイラの更新
- ネイティブ・イメージ
- JavaScript
- Ruby
- Python
- R
- LLVMランタイム
- Java on Truffle
- ポリグロット埋込み
- Truffle言語およびツールの実装
- ツール
プラットフォームの更新
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 11.0.15 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.3 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Javaおよびコンパイラの更新
- カウント・ループは、ループの反復制限がバインドされた整数であることを確認するためにコンパイラが使用する抽象化です。このようなループは、ベクトル化や部分的な展開などの主要な最適化の対象となります。Truffle APIは、コンパイラによって定数として処理できる最大値を持つループ・カウンタ値をプロファイルおよび推測する機能を提供します。Graalコンパイラはこの推測に従って、最大値が十分に小さい場合はこのようなループを展開します。たとえば、このRubyループは展開されます:
[1, 2].each { |e| print e }
- JDK 17の時点で、
@IntrinsicCandidate
で注釈が付けられたすべての組込み関数を実装しました。 DuplicateIrreducibleLoops
オプションを削除しました。削減できないループ処理を無効にするには、-Dgraal.MaxDuplicationFactor
を1以下の値に設定します。Ahead-of-Time (AOT)コンパイルのために、削減できないループの処理にかかる作業量が増加し、ネイティブ・イメージで、削減できないループによりより多くのプログラムをサポートできます。特に、これはこの問題を軽減します。
ネイティブ・イメージ
- オプション
--allow-incomplete-classpath
がデフォルトで有効になっていますが、不要になったため非推奨になりました。つまり、デフォルトでは、ビルド時ではなく実行可能ファイルの実行時にリンク・エラーがスローされるようになります。新しいオプション--link-at-build-time
では、パッケージおよびクラスの指定されたリストについて、ビルド時にリンクできます。native-image --link-at-build-time=foo.bar,foobar.core.MyClass --link-at-build-time=my.other.RandomClass ...
のように、コマンドラインで特定の数の引数とともに必要な数の--link-at-build-time
オプションを指定できます。詳細は、#4305を参照してください。 - 開発中にネイティブ実行可能ファイルの生成にかかる時間を短縮するために、新しいクイック構築モードが追加されました。既存のオプションを使用してこれを有効にし、最適化レベル(
-Ob
)を選択します。b
はビルド時間の最適化を意味します。このモードは、ピーク・パフォーマンスおよび結果の実行可能ファイルのサイズに悪影響を及ぼす可能性があるため、開発目的でのみ推奨されます。 - トレース・エージェントを使用して条件付き構成を生成するための新しい試験段階のモードが追加されました。エージェントは、コール・グラフで動作するヒューリスティック(つまり、述語クラスにアクセス可能な場合にのみ登録されるリフレクション要素)を使用して、条件付きリフレクション構成を生成できるようになりました。次の2つのモードがサポートされています:
- エージェントに
experimental-conditional-config-filter-file=<path>
を渡します。このモードでは、エージェントは構成を直接生成します。フィルタは、ユーザーのアプリケーションに属するコードをエージェントに通知します。条件は、ユーザーのアプリケーションに属するクラスでのみ生成されます。 experimental-conditional-config-part
をエージェントに渡し、native-image-configure generate-conditional --user-code-filter=<path> --input-dir=<agent-ouput> --output-dir=<config-output>
を使用して構成を生成します。詳細は、ネイティブ・イメージのドキュメントを確認してください。
- エージェントに
-
ネイティブ実行可能ファイルのサイズを減らすのに役立つコード・サイズの改善が導入されました。パフォーマンスの向上と
native-image
ジェネレータのメモリー・フットプリントの削減により、ビルド時間が短縮されています(新しいクイック・ビルド・モードに依存しません)。次の表に、よく知られている大規模アプリケーションSpring petclinic-jdbcのイメージ・サイズと実行可能ファイルのビルドにかかった時間を示します。数値は、Linux、AMD64、JDK 11、GraalVM Enterprise、spring-native 0.10.3を使用して開発者のマシンで測定されています。GraalVMバージョン ビルド時間 実行可能ファイルのサイズ -Obによるビルド時間 GraalVM 21.1 2分50秒 138MB GraalVM 21.2 2分43秒 133MB GraalVM 21.3 2分13秒 121MB GraalVM 22.0 2分20秒 119MB GraalVM 22.1 2分5秒 103MB 1分17秒 - チップ上のARMベースのシステムであるApple Siliconのサポートが追加されました。欠落していた機能の1つに、Truffle Just-in-Timeコンパイルのサポートなどがありました。
- レコード・クラスのAhead-of-Timeコンパイルが改善されました。たとえば、レコード・クラスの注釈に実行可能ファイルの実行時にアクセスできるようになりました。
- 次のJFRイベントのサポートが追加されました:
SafepointBegin
、SafepointEnd
、GarbageCollection
、GCPhasePause
およびGCPhasePauseLevel
(すべてRed Hatによって提供)。GC関連のすべてのJFRイベントは、現在シリアルGCに制限されています。 - JFRは、コマンドラインで
-J-XX:StartFlightRecording=dumponexit=true
をnative-image
に追加することで、native-image
ツール自体をプロファイルするために使用できるようになりました。 static synchronized
メソッドの処理が改善されました: ロックがセカンダリ・モニター・マップに格納されなくなり、変更可能なDynamicHubCompanion
オブジェクトに格納されるようになりました。この変更により、static
メソッドの同期は、インスタンス・メソッドの同期と同じ速さで行われます。- 特権操作を使用して変更できるコンテキストの制御に役立つ
AccessControlContext
のサポートが追加されました。 - 参照処理が、デフォルトで個別のスレッドで実行されるようになりました。これは、参照を処理し、同じスレッドでガベージ・コレクションを実行する場合に、デッドロックを発生させないようにするのに役立ちます。
gdb
から起動でき、ネイティブ実行可能ファイルのデバッグに役立つ、ネイティブ実行可能ファイルにヘルパー・メソッドを含める可能性が追加されました。この機能を有効にするには、オプション-H:+IncludeDebugHelperMethods
をnative-image
に指定します。- JDK 8がサポートされなくなったため、
JDK8OrEarlier
およびJDK11OrLater
クラスは非推奨になりました。これは、将来のリリースでは削除される予定です。 - 到達可能性に関係なく、すべての注釈付き要素(クラス、メソッド、フィールドなど)がイメージに含まれるようになります。特に動的に生成されたプロキシの場合、いくつかの構成変更が必要になることがあります。たとえば、次のコードを使用している場合です:
@AccessedAnnotation @NonAccessedAnnotation class Example { boolean func(Object obj) { Proxy.getProxyClass(classLoader, Example.class.getDeclaredAnnotations()); obj.isAnnotationPresent(AccessedAnnotation.class); } }
以前は、
[AccessedAnnotation]
構成のみを指定していました。これで、プロキシ構成は[AccessedAnnotation]、[NonAccessedAnnotation]
のようになります。 META-INF/MANIFEST.MF
のクラス・パス・エントリが誤った順序で処理されないようになりました。詳細は、#4374を参照してください- 現在、
-H:CompilerBackend=llvm
の使用は、native-image
ビルダーが(--module-path
フラグを使用してビルドする場合)モジュール・パスで実行される場合にも機能します。詳細は、#4336を参照してください。 - リソース・パスに作業ディレクトリとしてスラッシュ
/
が含まれている場合、コンテナ内のネイティブ実行可能ファイルのビルドが改善されました。詳細は、#4002を参照してください。
JavaScript
- Node.jsがバージョン16.14.2に更新されました。
- いくつかの提案が実装されました:
- Intl.NumberFormat v3の提案。
- 配列のグループ化の提案。
--js.ecmascript-version=staging
オプションを使用して、ECMAScriptステージング・モードで使用できます。 - 一時的な提案。試験段階のオプション
--js.temporal
の背後で使用できます。 - 最後からの配列の検索の提案。
--js.ecmascript-version=staging
オプションを使用して、ECMAScriptステージング・モードで使用できます。
- 文字列スライスのコピー動作を切り替えるために、
true
にデフォルト設定された新しいオプション--js.string-lazy-substrings
が追加されました。有効にすると、文字列スライスによって、指定された文字列リージョンをコピーするかわりに内部的に文字列ビューが作成されるため、パフォーマンスが向上しますが、メモリー使用率も増加する可能性があります。
変更の完全なリストは、changelogを参照してください。
Ruby
- Rubyの完全な3つのキーワード引数セマンティクスが実装されました(#2453を参照)。
- 外部例外は完全に統合され、ほとんどの
Exception
メソッドが含まれ、rescue Polyglot::ForeignException
またはrescue foreign_meta_object
で修復できます(#2544を参照)。 - 外部例外は
RuntimeError
に変換されなくなりますが、かわりに外部例外として残ります。例外を修復する方法は、ドキュメントを参照してください。 - ダイジェストのデフォルトのgem、RubyGems、およびバンドラ(#2577、#2605、#2586)の様々な修正が追加されました。
- ネストされたモジュールが存在しない場合に
NameError
を発生させるためにModule#const_get
が修正されました。これはRails 7スキャフォールディングに必要です。 - ウォームアップ・パフォーマンスを向上させるために、インタプリタ内のメソッド・コールに対する追加の配列割当てが削除されました。
- C拡張用のメモリー・フットプリントが削減されました(残りの部分からInit_の割当ての分離、ハンドルの削減など)。
Dir[]
、String#<=>
、Regexp#match?
、およびFile.read
が最適化されました(#2536を参照)。
変更の完全なリストは、changelogを参照してください。
Python
- Python REPLの起動速度が30%向上し、メモリー使用量が40%減少するモジュール休止のサポートが追加されました。
- さらに多くの形式の
ssl
モジュールの秘密キー(PKCS#1、パスワード保護)のサポートが追加されました。 - 次のPyPIパッケージとの互換性が向上しました:
lxml
、pytz
、Pillow
、urllib3
、setuptools
、pytest
、twine
、jinja2
およびsix
。
変更の完全なリストは、GitHubに関するchangelogを参照してください。
R
- JavaGDがデフォルトのグラフィカル・サブシステムになりました。
--R.UseInternalGridGraphics
オプションは非推奨です。graphics
grid
およびgrDevices
ベース・パッケージのほとんどの関数がサポートされています。サポートされているデバイスは、SVG、PNG、JPEG、BMP、AWTです。表示リストは完全に実装されています。詳細は、ドキュメントを参照してください。 - GraalVMのRランタイムでは、このライブラリ独自のコピーではなく、システム
zlib
が使用されるようになりました。これにより、zlib
はGraalVMのRランタイムで必要になりますが、ほとんどのLinuxディストリビューションおよびサポートされているすべてのmacOSバージョンにはzlib
が事前にインストールされています。これが当てはまらない場合がありますが、Dockerイメージを削除して最適化される場合があります。
プロジェクトの変更ログをGitHubで参照できます。
LLVMランタイム
- C/C++スレッド・ローカル・ストレージのサポートが追加されました。
- 新しい相互運用性APIのサポートが追加されました:
Date
、Time
、TimeZone
およびInstant
(graalvm/llvm/polyglot-time.h
を参照)Buffers
(graalvm/llvm/polyglot-buffer.hを参照)
--llvm.*
ネームスペースのカスタム・ロギング・オプション(--llvm.traceIR
など)がTruffle Loggerオプション(--log.llvm.*
) (--log.llvm.TraceIR.level=FINER
など)に置き換えられました。
GitHubに関するプロジェクトchangelogで、変更およびオプションの置換の全リストを参照してください。
Java on Truffle
- シングルスレッド・モードで明示的な参照処理が有効になりました。これは、リソース・リークを防ぐために、多くの状況でシングルスレッド・モードを使用できるということです。
<ProcessReferences>
というコマンドとして使用でき、context.eval("java", "<ProcessReferences>")
で実行できます。 - 新しいホットスワップ機能が導入されました:
- スーパークラスおよび実装済インタフェースの変更のサポートが追加されました。
- 状態が保持される「階層内のフィールドの移動」のリファクタリングのサポートが追加されました。
- デフォルトで、フィールドおよびクラス・アクセス修飾子の変更がオンになっています。
- 多くの状況でTruffleセーフポイントへの迅速な対応が有効になっています(モニターの使用時を含む)。
- ゲスト言語プログラムの実行中にスローされる例外処理を改善するために、AbstractTruffleException APIが導入されました。
- デフォルトで有効になっている
jimages
(libs/modules
)を読み取るための新しい実装が追加されました。これにより、LLVMバックエンドの使用時のコンテキスト起動時間が短縮されます。古い実装に戻すには、--java.JImage=native
を使用します。 - Java on Truffle LLVM Javaライブラリは、macOS (以前はLinuxディストリビューションでのみ使用できました)用に提供され、GraalVMアップデータ:
gu install espresso-llvm
を使用してインストールできます。
ポリグロット埋込み
Map
からList
の配列要素とメンバーの両方を含む値について、デフォルトのオブジェクト・ターゲット・タイプ・マッピング(Value.as(Object.class))を変更しました。これは非互換の変更であることに注意してください。Object
ターゲット・タイプの強制後に動的タイプMap
に依存する埋込み機能では、コードを移行する必要があります。前述の動作は、カスタムのターゲット・タイプ・マッピングを使用してリストアできます。次に例を示します:HostAccess access = HostAccess.newBuilder(HostAccess.EXPLICIT) .targetTypeMapping(Value.class, Object.class, v -> v.hasMembers() && v.hasArrayElements(), v -> v.as(Map.class)) .build(); try (Context c = Context.newBuilder().hostAccess(access).build()) { // run application }
changelogはGitHubで入手できます。
Truffle言語およびツールの実装
- Webサイトの情報をインストゥルメントする手段として、Truffle言語(
Language#getWebsite()
およびInstrument#getWebsite()
)用のAPIが追加されました。開発者は、言語/ツールの詳細とともにWebサイトのURLを指定できます。 - Truffle言語(Truffleフレームワークで実装された言語)間で共有できるプリミティブ文字列型であるTruffleStrings実装が追加されました。詳細は、Truffle文字列ガイドを参照してください。
- テンプレート・ノードが公開されている場合でも、生成されたノードの表示をpackage-privateに変更するための
@GeneratePackagePrivate
注釈が追加されました。 java.lang.Class
ベースのバージョンを拡張、置換、および非推奨にするタイプとして、ホスト・シンボルおよびホスト・クラスを受け入れるTruffleLanguage.Env#createHostAdapter
が追加されました。- 開発者がオプションに必要な構文を指定できるように、
usageSyntax
プロパティがOption
に追加されました。詳細は、Javadocを参照してください。 - 非推奨の
TruffleException
が削除されました(GraalVM 20.3.0以降に非推奨になりました)。AbstractTruffleException
は、TruffleException
を実装しなくなりました。TruffleException
から継承されたAbstractTruffleException
メソッドが削除されました。この削除の一環として、例外の処理方法の言語に関する推奨事項が更新されました。 TruffleContext.Builder
にメソッドが追加されました。これにより、新しい組込みコンテキストが取り消されたり、ハード終了されたり、閉じられたり、対応する例外が外部コンテキストに到達しようとしたときにカスタムのゲスト例外をスローできるようになりました。カスタマイズが使用されておらず、新しいコンテキストが取り消されたり、ハード終了されたり、閉じられた場合、Truffleは内部エラーを新たにスローします。TruffleRuntime.getCurrentFrame()
およびTruffleRuntime.getCallerFrame()
が非推奨になりました。これらは、FrameInstance
クラスの安全でない使用を推奨していました。
リリースのその他の非推奨と更新は、プロジェクト変更ログに関する項にリストされています。
ツール
GraalVM for JavaのVS Code拡張機能
-
VS CodeのGraalVM組込みインストール・ウィザードを使用して、GraalVM Enterprise Editionおよびその付属のコンポーネントをダウンロードしてインストールするためのワークフローが更新されました。以前と同様に、GraalVM Enterpriseコアまたは追加のコンポーネントをインストールするには、有効な電子メール・アドレスを入力し、ライセンス契約に同意する必要があります。インストール・ウィザードでは、ユーザーの電子メール・アドレスにバインドされたダウンロード・トークンが使用され、同意したライセンスのセットが定義されます。電子メールの検証とライセンスの同意は、ユーザーの電子メール・クライアントを介して行われます。詳細は、ドキュメントを参照してください。
-
動的機能コールを追跡および登録するプロセスを自動化する「NATIVE IMAGE」ペインが追加され、VS Codeでネイティブ実行可能ファイルを簡単にビルドできるようになりました。このペインは、GraalVMおよびネイティブ・イメージをインストールすると使用可能になります:
-
拡張機能により、VisualVMのVS Code統合が改善されました。VisualVMを開き、Javaプロセスのモニターを開始するための特別な起動構成を作成する必要はありません。「VISUALVM」ペインで再生ボタンをクリックします:
-
Groovyを実行およびデバッグする機能など、Groovyのサポートが改善されました。
GraalVMアップデータ
- GraalVMアップデータ
gu
を使用して、コマンドラインからGraalVM Enterprise Editionにコンポーネントをインストールするワークフローが強化されました。GraalVMアップデータでは、ユーザーの電子メール・アドレスにバインドされたダウンロード・トークンを作成して使用し、同意したライセンスのセットを定義します。以前のように、コンポーネントをインストールするには、ユーザーは有効な電子メール・アドレスを指定してライセンス契約に同意する必要がありますが、現在は、ユーザーの電子メール・クライアントで電子メールの検証とライセンスの同意が行われます。詳細は、ドキュメントを参照してください。
Oracle GraalVM Enterprise Edition 22.0.0
(2022-01-18)
- Javaおよびコンパイラの更新
- プラットフォームの更新
- ネイティブ・イメージ
- JavaScript
- Ruby
- Python
- R
- LLVMランタイム
- WebAssembly
- Java on Truffle
- ポリグロット埋込み
- Truffle言語およびツールの実装
- ツール
プラットフォームの更新
- Java 8のサポートが廃止されました。このリリース以降では、GraalVM Enterpriseディストリビューションは、JDK 11および17のみに基づいています。
-
JDKバージョン12、13、14、15および16のサポートが削除されました。
- GraalVM Enterprise EditionのビルドのベースとなるOracle JDKリリースは、次のように更新されました:
- 11.0.14 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.2 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Javaおよびコンパイラの更新
- より多くの非カウント・ループをカウント・ループに変換する新しいループ・ローテーション最適化が追加されました。カウント・ループは、ループの反復制限がバインドされた整数であることを確認するためにコンパイラが使用する抽象化です。ループがカウントされると、パフォーマンスを向上させるために、部分的な展開、ベクトル化およびその他の最適化が可能になります。たとえば、JDK 17の
LinkedList.toArray()
に次のコードがあります:public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item; return result; }
コンパイラによって次のように最適化されます:
public Object[] toArray() { Object[] result = new Object[size]; int i = 0; Node<E> x = first; if (x == null) return result; // Loop condition 1 while (true) { if (i |>=| result.length) deoptimize(); // Loop condition 2 result[i++] = x.item; x = x.next; if (x == null) break; // Loop condition 1 } return result; }
LinkedList.toArray()
を中心としたマイクロベンチマークでは、ループ・ローテーションにより、パフォーマンスが10%強のみ向上します。形状が類似した非カウント・ループが多く含まれるワークロードでは、最大30%のパフォーマンス改善が測定されています。ループ・ローテーションは、22.0ではデフォルトで無効になっており、-Dgraal.LoopRotation=true
で有効にできます。 - 実行プロファイルのGraalコンパイラ処理が改善されました。Graalは、基盤となるランタイム(HotSpot VMまたはネイティブ・イメージ)によって収集されたプロファイル(ここおよびここを参照)に大きく依存する積極的なJITコンパイラとして設計されました。プロファイルは、どのブランチが重要であるか、ループが実行される頻度、およびポリモルフィック・コードで使用されるタイプを決定するためにコンパイラで使用されます。つまり、コンパイラはプロファイルに依存して、最適化作業の集中先を決定します。そのため、プロファイルの品質は、インライン化、複製、ベクトル化などの最適化に不可欠です。これで、コンパイラは「AOT」(Ahead-of-Time)モードに自動的に切り替わり、プロファイルがない状態でも主要な最適化で適切なジョブを引き続き実行できます。これは、次のような状況で役立ちます:
- まだ注目される可能性がある一般的ではないパターンをプロファイルしないTruffle言語。
- PGOを使用しないネイティブ・イメージ。
GraalVM Enterpriseでは、適切なプロファイルを持たないループおよびタイプ・チェックの重いベンチマークで、パフォーマンスが最大25%向上しました。この最適化は常に有効であり、コンパイラの中核にあるため無効にできません。これはユーザーに対して透過的であり、正確なブランチおよびループ・プロファイルがない場合に一般的に適切なコードを提供する必要があります。
- タイプ・スイッチのネイティブ・イメージ(一連のカスケード
instanceof
ブランチ)のパフォーマンスを向上させるための新しい最適化が追加されました。たとえば:void foo(Object o) { if (o instanceof A) { ... } else if (o instanceof B) { ... } else if (o instanceof C) { ... } }
新しい最適化では、
o
のクラスのnullチェックおよびロードが除外されます:void foo(Object o) { if (o != null) { Object nonNullO = o; Class oClass = nonNullO.getClass(); if (A.class.isAssignableFrom(oClass)) { ... } else if (B.class.isAssignableFrom(oClass) { ... } else if (C.class.isAssignableFrom(oClass)) { ... } }
この最適化は、ネイティブ・イメージが割当てと認識するA、BおよびCのサブクラスがある場合にのみ効果があります。それ以外の場合、
instanceof
テストはo
のクラスでの==
比較になります。
GraalVM Community Editionでのコンパイラの変更箇所の完全なリストは、コンパイラの変更ログを参照してください。
ネイティブ・イメージ
- イメージ・サイズを削減するための更新の追加: スタック・フレーム・メタデータのエンコーディングが圧縮されると、すべてのイメージのイメージ・サイズが小さくなります。また、
String.format()
の最適化された実装により、「Hello World」などの小規模なイメージではローカライゼーション・クラスにアクセスできなくなり、サイズが大幅に削減されます。ノート:String.format
の最適化は、GraalVM Enterpriseでのみ使用できます。 - GraalVM 22.0は、
native-image
ビルダーをJDK 8で実行できる最後のリリースです。JDKバージョン12、13、14、15、16はサポートされなくなったため、これらのバージョンを明示的にチェックして許可する必要はありません。GraalVM JDK 11またはJDK 17ではネイティブ・イメージを使用することをお薦めします。 - 進捗バーとネイティブ・イメージ・ビルド・プロセスに関するより詳細な要約情報が記載された
native-image
のユーザーフレンドリなビルド出力が新しく導入されました。古い出力は、-H:-BuildOutputUseNewStyle
を使用してリストアできます。 - シリアルGCの新しいガベージ・コレクション・ポリシーがデフォルトで有効になりました。これにより、GCにかかる時間やアプリケーションのRSSサイズが最大で30%削減されます。シリアルGCアルゴリズムは、小さなヒープに適しています。
- Javaプラットフォーム・モジュール・システムのサポートの向上: オプション
--add-reads
および--add-modules
は、native-image
でサポートされるようになりました。また、--add-reads
、--add-exports
、--add-opens
などのモジュール関連のすべてのオプションは、クラスパス/モジュールパス・スキャンの前に適用されるようになりました。これにより、クラス・ロード前にモジュールが適切に構成され、クラス・ロード・エラーを回避できます。モジュールの詳細情報がイメージ・ヒープに追加され、実行時により多くのモジュール・イントロスペクションが可能になります。 - JDK 17のシール済クラスのリフレクティブ・イントロスペクションのサポートの追加:
Class.isSealed()
およびClass.getPermittedSubclasses()
。 - JLine 2のサポートが削除されました。JLine 2の代替機能は、従来、ネイティブ・イメージに含まれていました。JLine 2は保守されなくなったため、サポートは代替機能なしで削除されました。
- JSONファイルを介して代替機能を登録するためのオプション
-H:SubstitutionFiles=...
が削除されました。 - CからJavaへの相互運用性の更新: CからJavaへの
@CEntryPoint
エントリ・ポイントのカスタム・プロローグ、エピローグおよび例外処理メソッドは、@Uninterruptible
で注釈を付ける必要があります。これらは常に割込み不可能として扱われていましたが、現在は明示的にマークする必要があります。 - ネイティブ・イメージAPIの改善: エントリ・ポイントを共有ライブラリに自動的に追加するかどうかの制御に使用できる
CEntryPoint#include
属性が追加されました。ネイティブ・イメージAPIは、Windows AARCH64プラットフォームでもサポートされるようになりました。
JavaScript
- ECMAScript 2022モード/機能がデフォルトで有効になりました。
- Node.jsがバージョン14.18.1に更新されました。
- いくつかの提案の実装: Intl.DisplayNames v2、Intl Locale Info、Intl.DateTimeFormat.prototype.formatRange、Extend TimeZoneName Option、Intl Enumeration API。
- ESモジュールのベア指定子の解決方法をカスタマイズするための新しいオプション
js.esm-bare-specifier-relative-lookup
(デフォルトはfalse
)が追加されました。無効にすると、絶対パス検索でベア指定子が解決されます。有効にすると、ベア指定子はインポートするモジュールのパスに対して相対的に解決されます。
変更の完全なリストは、changelogを参照してください。
Ruby
- Ruby 3.0.2に更新されました。#2453を参照してください。このリリースでは、Ractor、パーサーの変更、およびキーワード引数の変更を除き、Ruby 3の変更のほとんどが実装されています。
- TruffleRubyではJava 11以降が必要になり、Java 8はサポートされなくなりました。
- シンボルと同様の方法でインターン化されるように、Regexpオブジェクトが更新されました。その結果、すべてのRegexpインスタンスが固定されます。
- インタプリタの高速化(コードがJITコンパイルされる前)のための様々な最適化が追加されました。
変更の完全なリストは、changelogを参照してください。
Python
pyexpat
モジュールのサポートが追加されました。これは、非検証のXML解析を高速で行うためのPythonモジュールで、expat
とも呼ばれます。- 表形式データをCSV形式で読み書きするための
_csv accelerator
モジュールが実装されました。 wheel
、click
、ujson
などのPyPIパッケージとの互換性が改善されました。
プロジェクトの変更ログをGitHubで参照できます。
R
- 内部インフラストラクチャ、Truffleフレームワークおよび一般的なRパッケージとの互換性が改善されました。
- このリリースで削除された古いAPIの代替として、新しいNodeLibraryが採用されました。特定のノードの場所に関連付けられたゲスト言語情報へのアクセスを提供します。これは、GraalVMツール開発者がR言語をより適切にサポートするのに役立ちます。
NodeLibraryが導入されました
プロジェクトの変更ログをGitHubで参照できます。
LLVMランタイム
- 新しい Truffle Frame APIに切り替わりました。
- 第1層コンパイル済コードでもプロファイルを報告するように、ループ数が最適化されました。これにより、ループの多いメソッドの場合、第1層から第2層のコンパイルに早く移行することで、ウォームアップが改善されます。
- 同じ「soname」を持つライブラリがすでにロードされている場合、ライブラリの依存関係を適切に再利用するための修正が追加されました。これにより、ユーザーは、ライブラリ検索パスで自動的に検出できないライブラリを最初に手動でロードすることによって、そのライブラリに依存できます。
プロジェクトの変更ログをGitHubで参照できます。
WebAssembly
- 新しいFrame APIを採用することで、GraalVMのWebAssemblyランタイムとTruffleフレームワークとの互換性が改善されました。
- Sign-Extension-Ops提案が実装されました。これは、試験段階のオプション
--wasm.SignExtensionOps
の背後で使用できます。
Java on Truffle
- 新しいFrame APIを採用することで、Truffleフレームワークとの互換性が改善されました。
- クラス再定義時のより多くのクラス変更、つまりフィールドおよびクラス・アクセス修飾子の変更のサポートが追加されました。
--java.ArbitraryChangesSupport=true
フラグを指定して有効にします。
ポリグロット埋込み
- ポリグロット分離の最初のバージョンが導入されました。
Context.Builder.option("engine.SpawnIsolate", "true")
をコールすることで、Engine
またはContext
ごとにネイティブ・イメージ分離を生成できます。これにより、ホスト・アプリケーションとゲスト・アプリケーション間のヒープ分離が可能になります。分離を使用すると、ポリグロット言語のセキュリティ、起動およびウォームアップ時間が改善され、ゲスト・アプリケーションに強力なメモリー分離が提供されます。このモードでは、ホストとゲスト間のコールは、ネイティブ境界を越える必要があるため、コストが高くなります。ホストとゲスト間の強力な循環参照を回避するために、このモードではHostAccess.SCOPED
ポリシーを使用することをお薦めします。このモードは、このリリースでは試験段階のものであり、JavaScriptでのみサポートされています。
プロジェクトの変更ログをGitHubで参照できます。
Truffle言語およびツールの実装
- 新しいAPIが
com.oracle.truffle.api.frame.Frame
およびcom.oracle.truffle.api.frame.FrameDescriptor
に追加されました:Frame
に、索引ベースのスロットの新しい「ネームスペース」が追加されました。これは、フレーム記述子の構築時に定義され、後で変更することはできません。Frame
に、スロット(補助スロットと呼ばれる)の2番目の新しい「ネームスペース」が追加されました。これは、フレーム記述子に動的に追加でき、「オブジェクト」スロットのみをサポートします。- 新しいAPIでは、
get...
/set...
メソッドに加えて、フレーム・スロットのcopy
およびswap
もサポートされます。 FrameSlotTypeException
は未チェックの例外になり、多くのAPIが簡素化され、FrameUtil
クラスの必要性がなくなります。
- 共有レイヤーが導入されました。共有レイヤーは、1つ以上のポリグロット・コンテキスト内でコードを共有する言語インスタンスのセットです。以前のリリースでは、新しい言語コンテキストが作成されるたびに、言語インスタンスが個別に共有されていました。かわりに、レイヤー全体を共有できる場合にのみ、言語インスタンスが新しいコンテキストで再利用されるようになりました。レイヤーの初期化されたすべての言語が同じコンテキスト・ポリシーをサポートし、それらのオプションに互換性がある場合、レイヤーを共有できます。監視可能な言語の動作に変更があることに注意してください:
- 複数の言語にわたる終了をサポートするために、Truffle Exit APIが導入されました。言語が終了をトリガーする統一された方法を提供します。トリガーされると、初期化済のすべてのゲスト言語に
TruffleLanguage.exitContext(C,ExitMode,int)
を使用して最初に通知され、次にすべてのコンテキスト・スレッドが停止され、最後にコンテキストがクローズされます。詳細は、ドキュメントを参照してください。 - コンテキストがまだアクティブなすべてのスレッドで言語によって作成された残りの閉じていない内部コンテキストをすべて残しておくために、
TruffleLanguage.finalizeContext(Object)
に新しい要件が課されました。TruffleLanguage.finalizeContext(Object)
が返された後、アクティブな内部コンテキストは許可されません。この要件を満たさないと、内部エラーが発生します。非アクティブな内部コンテキストは、親コンテキストによって暗黙的に閉じられることに注意してください。 engine.TraceCompilation
およびengine.TraceCompilationDetails
の出力形式が改善されました。詳細は、ドキュメントを参照してください。- コード共有に関するデバッグ情報を記録できる
--engine.TraceCodeSharing
オプションが追加されました。 - 強制的にコード共有を有効または無効にできる
--engine.ForceCodeSharing
および--engine.DisableCodeSharing
オプションが追加されました。このオプションは、プロセスのすべてのコンテキストで共有を有効または無効にするテストに役立ちます。
更新の完全なリストは、変更ログを参照してください。
ツール
VS Code拡張機能
-
論理プロジェクト構造の概要を示し、ソースをグループ化し、Javaパッケージ構造の探索を大幅に簡素化するプロジェクト・エクスプローラが追加されました。プロジェクト・エクスプローラは、従来のワークスペース・エクスプローラに追加されます。これを使用して、MavenおよびGradle Javaプロジェクトのビルド、テスト、実行および操作を行います:
-
次のようなVS Code用のGraalVM拡張機能の多数のリファクタリングおよび改善が導入されました:
-
変更メソッド・シグネチャのリファクタリング用のグラフィカルUIの提供:
-
他のいくつかの設定が含まれるソース・ファイルのインポートを編成する機能:
-
equals()
およびhashCode()
メソッドを生成する機能
-
- 開いているJavaファイルのすべての詳細を提供するアウトライン・ビューが追加されました
-
独自のクラスパスとJDKを使用して、VS Codeインスタンスごとに個別のNetBeans Language Serverを実行する機能が追加されました。新しいオプション
userdir = global | local
を使用します: - SDKManを使用してGraalVMのインストールを管理する機能が追加されました
- パフォーマンスと信頼性の向上、およびスタンドアロンのGroovyスクリプト・ファイルを実行する機能(Spockテストなし)により、Groovy言語サポートが改善されました
- GraalVMネイティブ・イメージの公式ビルド・プラグインを使用するように、Micronaut Gradleプラグインが更新されました。その結果、Micronaut: ネイティブ・イメージのビルド…アクションでは、
nativeImage
ではなくnativeCompile
ジョブがコールされます。
VisualVM
-
JFRイベントを使用した正確なスレッド状態のモニタリングが追加されました。#363を参照してください。
-
JDK 18の予備のサポートが追加されました。