Oracle GraalVM for JDK 22.0.1
(2024-04-16)
これは、Oracle GraalVM for JDK 22の2024年4月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを22.0.1+8に更新しました。JDK 22リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン24.0.1は、GraalVM for JDK 22.0.1で使用するように設計されています。
- Graalコンパイラ:
- SIMDベクトル化を削除しました。
- DOMツリーを尊重するために、ガードが
MoveGuardsUpwards
にアタッチされていることを確認します。 OptimisticAliasingAnalysis
の前にOptimisticGuards
をクリーンアップとして実行します。- 常に非最適化する
FixedGuard
の簡略化を修正しました。 PiNode.canonical
再帰での削除に対するガードが追加されました。
- ネイティブ・イメージ:
- 仮想スレッド・グループを無条件に登録します。
- プロファイリングのすべての情報を含めるように
-g
を更新しました。objcopy
stripコマンドの問題を修正します。 IsolateAwareTruffleCompiler.tearDownIsolateOnShutdown
のデッドロックを修正しました。musl libc
なしで静的実行可能ファイルをビルドする場合は、エラーを報告します。- SBOutliningのパラメータ数を制限する場合にスタック・スロット・サイズを考慮します。
-O
、-march
およびビルド・アーティファクトがドキュメント化されています。
- Truffleフレームワーク:
- 実行時コンパイル・フェーズに
InsertGuardFencesPhase
が追加されました。
- 実行時コンパイル・フェーズに
- Java on Truffle (Espresso):
- デバッガがローカル変数表を要求したときのJDWPの
NullPointerException
が修正されました。 - まだロードされていないコード内でのステップ実行時のEspresso JDWPのシングルステップ実行を修正しました。
- デバッガがローカル変数表を要求したときのJDWPの
- Javascript:
- 基礎となるNode.jsをバージョン18.19.1にアップグレードしました。
instanceof
演算子に、左側が外部オブジェクトかどうかのチェックを追加しました。
Oracle GraalVM for JDK 22
(2024-03-19)
- プラットフォームとディストリビューション
- JDK 22の機能の利用可能性
- Javaおよびコンパイラ
- ネイティブ・イメージ
- ポリグロット・ランタイム
- ポリグロット埋込み
- JavaScriptおよびNode.js
- Java on Truffle
- Truffle言語およびツールの実装
プラットフォームとディストリビューション
- Oracle JDK 22に基づいたOracle GraalVM for JDK 22がリリースされました。JDK 22リリース・ノートを参照してください。
- バージョン互換性:
- Oracle GraalVM for JDK 22は、Truffle言語およびその他のコンポーネントのバージョン24.0.0と互換性があります。
JDK 22の機能の利用可能性
JEP | タイトル | Graal JIT | ネイティブ・イメージ |
---|---|---|---|
423 | G1のリージョン固定 | ✅ | ✅ JNIクリティカル・リージョン中、ガベージ・コレクションはすでに有効化されています |
447 | super(...)の前の文(プレビュー) | ✅ | ✅ |
454 | 外部関数およびメモリーAPI | ✅ | 🧩 #8113 |
456 | 無名変数およびパターン | ✅ | ✅ |
457 | クラス・ファイルAPI(プレビュー) | ✅ | ✅ |
458 | マルチファイルのソース・コード・プログラムの起動 | ✅ | ℹ️ |
459 | 文字列テンプレート(第2プレビュー) | ✅ | ✅ |
460 | ベクトルAPI(第7インキュベータ) | ✅ 完全最適化が進行中 | 🏗️ |
461 | ストリーム・ギャザラ(プレビュー) | ✅ | ✅ |
462 | 構造化同時実行性(第2プレビュー) | ✅ | ✅ |
463 | 暗黙的に宣言されたクラスおよびインスタンスのmainメソッド(第2プレビュー) | ✅ | ✅ |
464 | スコープ値(第2プレビュー) | ✅ | ✅ |
439 | 世代別ZGC (JDK 21から) | 🏗️ #8117 | ℹ️ |
✅ 完全利用可能 🧩 部分的に利用可能 🏗️ まだ利用不可。進行中 ℹ️ 該当しない
Javaおよびコンパイラ
- Graalモジュールの名前が
jdk.internal.vm.compiler
からjdk.graal.compiler
に変更されました。同様に、コンパイラ・パッケージはjdk.graal.compiler
ネームスペースに移動されます。この名前の変更は、Project Galahadの準備と、Graalサブプロジェクトのネームスペースjdk.graal
の確立のために行われました。#7621を参照してください。 - Graalオプションでは、
jdk.graal.
接頭辞(-Djdk.graal.PrintCompilation=true
など)が使用されるようになりました。レガシーのgraal.
接頭辞は非推奨ですが、引き続きサポートされています(たとえば、-Dgraal.PrintCompilation=true
)。 -Djdk.graal.PrintIntrinsics
を追加して、現在のランタイムでGraalによって使用される組み込み関数を記録するようにしました。
その他の更新については、変更ログを参照してください。
ネイティブ・イメージ
新機能
- x64アーキテクチャで、外部関数およびメモリーAPI (Project Panamaの一部、JEP 454)のサポートが試験的に追加されました。APIは、
-H:+ForeignAPISupport
で明示的に有効にする必要があります(-H:+UnlockExperimentalVMOptions
も必要です)。現在、外部メモリー機能および外部関数のダウンコールのサポートが含まれています。「制限された」ネイティブ操作を実行するモジュールは、--enable-native-access
オプションを使用して指定する必要があります。FFM APIサポートの詳細は、ネイティブ・イメージの外部関数およびメモリーAPIを参照してください。 --strict-image-heap
オプションはデフォルトで有効になっているため、引数リストから削除できます。これにより、すべてのクラスをビルド時に使用できるようになりますが、ヒープ内のすべてのオブジェクトの型をビルド時初期化用に明示的にマークする必要もあります。NATIVE_IMAGE_OPTIONS
環境変数のサポートが追加され、ユーザーおよびツールが環境を介して追加の引数を渡すことができます。JAVA_TOOL_OPTIONS
と同様に、環境変数の値がnative-image
に指定されたオプションの前に付加されます。GitHubイシュー#4650を参照してください。- ソフトウェア制御フロー整合性(CFI)を有効にするための専用の発信者保存ブランチ・ターゲット・レジスタが導入されました。
改善
- ネイティブ・イメージ・エージェントのコール追跡メカニズムが改善されました。エージェントは、
ClassLoader.findSystemClass
、ObjectInputStream.resolveClass
およびBundles.of
へのコールを追跡し、リソース・バンドルをバンドル名とロケールのペアとして登録するようになりました。 - JDK名形式と一致するように、ネイティブ・イメージのラムダ・クラス名形式を
CapturingClass$$Lambda/0xstableHash
に更新しました。 - メソッド・ハンドルの組込み化が改善されました。これは特に、組込みメソッド・ハンドルを使用するJavaレコードの
equals
およびhashCode
メソッドのパフォーマンスを向上させます。 - Javaオブジェクト・クラス、プリミティブ・クラスおよび配列クラスのメソッド、フィールドおよびコンストラクタが、リフレクション用にデフォルトで登録されるようになりました。
- 特別な例外をスローすることで、ネイティブ・イメージで欠落しているメタデータを報告するように改善しました(試験的)。ユーザーは、
-H:ThrowMissingRegistrationErrors=<package-prefix>
オプション(またはすべてのパッケージの場合は-H:ThrowMissingRegistrationErrors
)を使用して、メタデータ例外を早期に捕捉し、関連する問題をデバッグできます。 - ネイティブ・イメージが改善され、登録されたリフレクション問合せの実行時にビルド時リンク・エラーが正しく再スローされます。これにより、同じ問合せで例外をスローせずに空の結果が返されるのを防ぎます。GitHubイシュー#6691を参照してください。
System#setSecurityManager
は、例外をスローすることが予想される場合にVMエラーではなく、デフォルトでjava.lang.UnsupportedOperationException
をスローするようになりました。これにより、プログラムの実行が停止しなくなります。プロパティjava.security.manager
がプログラムの起動時にdisallow以外に設定されている場合、この関数はJava仕様に従ってjava.lang.SecurityException
をスローします。
デバッグおよびモニタリングの改善
- JFRイベント
AllocationRequiringGC
、SystemGC
およびThreadAllocationStatistics
のサポートが追加されました。GitHubプル・リクエスト#7263および#7294を参照してください。(Red Hatと共同。) - スレッド・ダンプを作成するためのAPIオプション
--enable-monitoring=threaddump
が提供されました。オプション-H:±DumpThreadStacksOnSignal
は非推奨となり、削除対象としてマークされています。
非推奨になった機能および削除された機能
- オプション
ParseOnce
、ParseOnceJIT
、およびInlineBeforeAnalysis
は非推奨であり、効果はありません。 - レガシーの
build
オプションがnative-image-agent
から削除されました。
ポリグロット・ランタイム
- レガシー
<language-id>.home
システム・プロパティのサポートが削除されました。org.graalvm.language.<language-id>.home
のみが使用されます。
ポリグロット埋込み
- ゲスト言語配列をコピーせずに配列要素にアクセスするために、
Value#as(Collection.class)
を使用してゲスト言語配列(Value#hasArrayElements()
)をJava Collectionインタフェースにマップする機能が追加されました。GitHubイシュー#260を参照してください。 - ホスト・アプリケーションの
byte[]
への相互運用バッファのマッピングを実装しました。これには次が含まれます:- バイト配列へのバッファの一括読取りを有効にする
Value#readBuffer(long, byte[], int, int)
が追加されました。 ByteSequence
のカスタム実装は、ByteSequence.create(byte[])
によって返される値と同様に、ゲスト言語によってバッファとして解釈されるようになりました。- ゲスト言語バッファをコピーせずにバイトにアクセスするために、
Value#as(ByteSequence.class)
を使用してゲスト言語バイト・バッファ(Value#hasBufferElements())
を読取り専用ByteSequenceインタフェースにマップする機能が追加されました。
- バイト配列へのバッファの一括読取りを有効にする
FileSystems#allowLanguageHomeAccess()
メソッドを非推奨にし、かわりにFileSystem#allowInternalResourceAccess()
を導入しました。互換性を確保するために、どちらの方法でも言語ホームと内部リソースがサポートされるようになりました。
変更ログに、更新内容の完全なリストがあります。
JavaScriptおよびNode.js
- Node.jsがバージョン18.18.2に更新されました。
- WebAssemblyスレッドの提案を実装しました。Promise.withResolversの提案を実装しました。ECMAScriptステージング・モード(
--js.ecmascript-version=staging
で有効)で使用できます。 - 非同期イテレータ・ヘルパー提案の実装(イテレータ・ヘルパー提案から分割)を試験的なオプション
--js.async-iterator-helpers
の後ろに移動しました。 - 整形されたUnicode文字列の提案を実装しました。ECMAScriptステージング・モード(
--js.ecmascript-version=staging
で有効)で使用できます。 - JSON.parseソース・テキスト・アクセス提案を実装しました。ECMAScriptステージング・モード(
--js.ecmascript-version=staging
で有効)で使用できます。 - Node.jsでのWebAssemblyサポートは、デフォルトで有効になっています。試験的なオプション
--js.webassembly=false
を使用して無効にできます。 - 対応するインポート属性の提案がアサーションの使用から属性の使用に移行されたため、
--js.import-assertions
オプションを--js.import-attributes
に置き換えました。
Java on Truffle (Espresso)
- ホストから埋め込まれたEspressoコンテキストに流れる一般的なJDK例外タイプを透過的に変換するためのサポートが追加されました。
- ホスト・プリミティブ配列を透過的にEspressoプリミティブ配列に変換するためのサポートが追加されました。
- 相互運用プロトコルを介してEspressoをコールする際の外部
BigInteger
のサポートが追加されました。また、fitsInBigInteger
およびasBigInteger
Truffle相互運用性メッセージの採用も含まれています。 - Espresso Listオブジェクトの
removeArrayElement
相互運用性メッセージのサポートが追加されました。 - 相互運用を介してコンストラクタを使用する場合、オーバーロード選択がメソッドのコールでサポートされているものと同等になるようにしました。
- Java on Truffle (Espresso)をJDK 22ホストで実行できるようになりました。サポートされているゲストJDKのバージョンは、8、11、17および21です。
Truffle言語およびツールの実装
- Truffle言語およびツールの実装は、コンテキスト・クラス・ローダーが設定されていて、そこでTruffleが見つかった場合、コンテキスト・クラス・ローダーを使用してのみロードされるようになりました。コンテキスト・クラス・ローダーが設定されていないか、Truffleが見つからない場合は、かわりにシステム・クラス・ローダーが使用されます。システム・クラス・ローダーに委任されないコンテキスト・クラス・ローダーは、通常、ホットリロード機能を実装するために使用されます。
--engine.AssertProbes
オプションが追加されました。このオプションは、ProbeNode
でenterとreturnが常にペアで呼び出されることをアサートし、ラッパー・ノードの正しい動作を検証します。このオプションを有効にするには、Javaアサーションをオンにする必要があります。- 共有と非共有のインライン・ノード/プロファイルの混在がインライン化サポート・コードのスロー・パスをトリガーする場合の新しいパフォーマンス警告がTruffle DSLに追加されました。
- システム・プロパティ
-Dtruffle.UseFallbackRuntime=true
が追加されました。このプロパティは、-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime
の使用よりも優先されます。 - バイト配列へのバッファの一括読取りを有効にする
InteropLibrary#readBuffer(long, byte[], int, int)
が追加されました。 - デバッガ・ステップ・ロジックに
onYield()
およびonResume()
インストゥルメンテーション・イベントを実装しました。
Truffleの変更ログに、更新内容の完全なリストがあります。