Oracle GraalVM for JDK 17.0.15
(2025-04-15)
これは、Oracle GraalVM for JDK 17用の2025年4月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2025年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを17.0.15+9に更新しました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.8は、GraalVM for JDK 17.0.15で使用するように設計されています。コンパイラ
- すでに作成されたループを追跡するためのアンローリング最適化を改善しました。
rethrowExceptionsのリセット処理をジャンプ・ターゲットの作成時に移動しました。ネイティブ・イメージCodeInfoGCTests.lifecycle()の一時的問題を修正し、テスト・インフラストラクチャに対して他にも様々な修正を追加しました。DebugHelperの@Uninterruptibleを修正しました。@Uninterruptibleを修正しました。acquireOnOOMEで正しい取得カウントの使用を実装しました。BuildPhaseProviderメソッドおよびVM診断登録を修正しました。- 仮想スレッドからのコール時の
System.getProperties()を修正しました。GraalJS - 基礎となるNode.jsをバージョン18.20.6にアップグレードしました。
- ASM依存関係を9.7.1にアップグレードしました。Truffleフレームワーク
- ASM依存関係を9.7.1にアップグレードしました。
Oracle GraalVM for JDK 17.0.14
(2025-01-21)
これは、Oracle GraalVM for JDK 21用の2025年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2025年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを17.0.14+8に更新しました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.7は、GraalVM for JDK 17.0.14で使用するように設計されています。
このリリースには、次の修正も含まれています:
- Graalコンパイラ
- MacroNodesのメソッド・ハンドル情報が取得されます。
immediate = Integer.MIN_VALUEを使用したAArch64MacroAssembler.add/subの無限再帰。StringBuilder(String)コンストラクタの引数に明示的なnullチェックを追加します。- セーフポイント・ポリシーの変更を追加します。
- 終了セーフポイントが無効になっている場合は、終了セーフポイントを許可しません。
- ネイティブ・イメージ
- リンク後のストリッピングが続く場合は、ローカル・シンボルを保持します。
- 置換を無効にするには、オプション
-H:DisableSubstitutionを追加します。 - VisualVMドキュメントを更新し、オプション
--enable-monitoringの検証をさらに追加します。 - JDK-8314794の採用: UTF8文字列のサポートを改善します。
OutOfMemoryErrorsに適切なメッセージを実装します。- JDK 21のJFR固有の置換を修正します。
- アクセス可能な非表示フィールドのタイプをマークします。
LIRNativeImageCodeCache.patchMethodsのメソッドごとに完全なウォッチドッグ・インターバルが使用可能であることを確認します。
- Truffleフレームワーク
sandbox.MaxHeapMemoryリソース制限のドキュメントを修正します。- 配列ベースの静的オブジェクトのストレージを取得する場合は、安全なキャストを使用します。
ObjectSizeCalculator#increaseByArraySizeのintオーバーフローを修正します。
- GraalJS
Polyglot.eval[File]の欠落している戻り値の変換を修正します。- モジュール内の
top-levelfor-await-ofの修正。Espresso - 配列ベースの静的オブジェクトのストレージを取得する場合は、安全なキャストを使用します。
Oracle GraalVM for JDK 17.0.13
(2024-10-15)
これは、Oracle GraalVM for JDK 17 (23.0)用の2024年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVM for JDK 17は、パーミッシブ・ライセンスが終了しました。17.0.13以降、Oracle GraalVM for JDK 17の新しいリリースは、GraalVM OTN License Including License for Early Adopter Versions (GOTN)で入手できます。この更新は、JDK 17がリリースされた2021年9月の時点で発表されました。GraalVM Free Terms and Conditions (GFTC)ライセンスで引き続き更新を受け取るユーザーは、Oracle GraalVM for JDK 21にアップグレードすることをお薦めします。
- Oracle GraalVMが構築されているOracle JDKリリースを17.0.13+10に更新しました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.6は、GraalVM for JDK 17.0.13で使用するように設計されています。
- Graalコンパイラ:
LocationMarker.buildのCompilationAlarm進捗チェックが追加されました。- ループ終了の実装: 値ノードとして使用される例外ノードはすべて、スケジュールの開始ノードを必要とします。
- ネイティブ・イメージ:
libgraalのビルド時のコンテナ・サポートが無効になりました。- ランタイム・ブート・モジュール・レイヤーに
Mainモジュールが含まれているかどうかを確認するテストが追加されました。 - VM内部コードでの大規模な配列割当てが
OutOfMemoryErrorsをトリガーしないようにします。 InheritedChannel.inetPeerAddress0()のクラッシュを修正しました。- 例外ハンドラへの最適化解除を修正しました。
- 様々なJNI関連のバグ修正を追加しました。
- 分析が状況依存の場合の
LoadFieldNodeのStrengthenGraphsを修正しました。 ValueConversionsでキャッシュを積極的に初期化しました。- JavaMonitorをjdk-24+11に更新しました。
- シリアルGCヒープ検証が改善され、その他のGC関連の変更が追加されました。
- クラス初期化エラーのスタック・トレースをメッセージに追加しました。
Provider.Service.constructorCacheフィールドをリセットしました。- reachability-metadata.json処理のJDK 17へのバックポート。
- Truffleフレームワーク:
- 例外ハンドラへの最適化解除を修正しました。
- JavaScript:
- 基礎となるNode.jsをバージョン18.20.4にアップグレードしました。
Oracle GraalVM for JDK 17.0.12
(2024-07-16)
これは、Oracle GraalVM for JDK 17用の2024年7月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを17.0.12+8に更新しました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.5は、GraalVM for JDK 17.0.12で使用するように設計されています。
- Graalコンパイラ:
- より多くの浮動小数点確率の比較にepsilonを追加しました。
CaptureStateBeginの後続でループをストリップ・マイニングしないように、ストリップ・マイニング最適化を改善しました。- 内部から外部への正しい状態を使用するように、カウントされたストリップ・マイニング最適化を改善しました。
- より多くの浮動小数点確率の比較にepsilonを追加しました。
AArch64AtomicMoveを修正しました。- 引数に正しい
ValueKindを使用して行われました。 cgroupサポートをJDK 17と同期しました。AMD64NormalizedUnsignedCompareOpで正しい比較サイズを使用して行われました。- マスクされたnegate strideに対して
isConstantStrideを適切に実装しました。 - 常に非最適化する
FixedGuardの簡略化を修正しました。 - 終了するオーバーフローが必要な符号なしのループはカウントしないでください。
- 様々な命令のEVEXエンコーディングのテストを追加しました。
- ネイティブ・イメージ:
-H:-ParseRuntimeOptionsが指定されている場合に、G1引数の解析をスキップするように実装されました。- 低層の最後にある
OpaqueValueNodesを削除しました - 特にティアダウン中のOOMEに対して、参照処理がより堅牢になりました。
getpwuidが削除され、getpwuid_rが優先されるようになりました。- ビルド・レポートの内訳チャートのデータ制限を修正しました。
- Epsilon GCの使用時に特定のGCテストを除外するチェックを追加しました。
- イメージ・ヒープ内の配列ベースのバッファに対して
Buffer.addressフィールドを再計算するようにしました。 - OS名の空白を無視するように
ProfileInferenceFeature.checkOsVersion()関数を更新しました。 - インライナによるタイムアウトを修正しました。
HeapImplMemoryMXBean.getHeapMemoryUsage()の一貫性の問題を修正しました。- 定期的なネイティブ・イベントの物理メモリー使用量およびJFRテストに対する部分的なサポートを追加しました。
- CCharPointerを"char"から"signed char"に変更しました。
OutOfMemoryError関連の修正をいくつか追加しました。- プロファイリングのすべての情報を含めるように
-gオプションを更新しました。objcopystripコマンドの問題を修正しました。 - 関数変換を検証するためのテストを追加しました。
- 黄色のゾーン・コードをVM内部コードとして扱わないでください。
- Truffleフレームワーク:
- Linuxでの
FileSystemsTest#testSetAttribute()の失敗を修正しました。 ContextPolicyTest#testOptionDescriptorContextReuseメソッドがより堅牢になるように改善しました。- speculateコール後に
SpeculationReasonを再利用できなかった問題を修正しました。 - 静的分析に役立つ具象
VirtualFrame戻り型を使用して行われました。
- Linuxでの
- JavaScript:
- 基礎となるNode.jsをバージョン18.20.2にアップグレードしました。
- ツール:
- サンプラがすでにクローズされている場合に中断を記録しないようにCPUSamplerを更新し、他の様々なCPUSampler修正を追加しました。
Oracle GraalVM for JDK 17.0.11
(2024-04-16)
これは、Oracle GraalVM for JDK 17用の2024年4月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースが17.0.11+7に更新されました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.4は、GraalVM for JDK 17.0.11で使用するように設計されています。
- Graalコンパイラ:
Integer.divideUnsignedのマジック番号の計算を修正しました。- 1つのコンポーネントを反転できない場合、SIMDStampを反転するときに
nullを返します。 - 初期化ベクトル(IV)に修正を追加: オーバーフローしない定数プロパティのみが定数である必要があります
- 正規化機能の置換の削除に対するガードを追加しました。
- カウントされたストリップ・マイニング最適化の修正:
longからintへのオーバーフロー・ロジックを改善しました- ループ終了状態が必ず一意となるようにします
CompilationResult.methodsに重複が含まれていないことを確認するチェックを追加しました。- 組込みフレームの状態を修正しました。
- スタック・サイズが正しくない未解決の脱最適化の
FrameStatesを修正しました。 - 不正な正規化を防ぐために、符号の有無が混在した比較で
Narrowを最適化しません。 - 固定読取りノードは、nullチェックとして使用されない場合にのみ削除する必要があります。
- DOMツリーを尊重するために、ガードが
MoveGuardsUpwardsにアタッチされていることを確認します。
- ネイティブ・イメージ:
- 例外処理が失敗した場合にクラッシュ・ログを出力します。
sun.nio.ch.Reflectに定数畳込みリフレクション・ルックアップを追加しました。@SVMTestsにカスタム例外ハンドラを使用します。- メソッドの検証をスピードアップします。
- AMD CPUの
Cpuid1Ecx機能解析を修正しました。 - デバッグ情報の破損につながる可能性のあるデバッグ・セクションの配置を修正しました。
-H:Path検証は、非バンドル・モードでのみ使用します。IsolateArgumentParserのバグを修正しました。_MSC_FULL_VERを前処理して、cl.exeバージョン情報を検出します。Thread.start()の直後にThread.getStackTrace()のテストを追加しました。Heap.allowPageSizeMismatch()を削除し、物理メモリー・サイズを設定するためのメソッドを提供しました。- クラッシュ・ログの改善を追加しました。
- ネイティブ・イメージ・エージェント・トレース・ファイル内の特定のJSON値の出力を正しく処理します。
Threadオブジェクトなしで最近開始されたスレッドとVmOperation中のNPEを処理します。- G1のコンテナ・サポート関連の修正と、ランタイム・ページ・サイズがビルド時ページ・サイズより小さいことのサポートを追加しました。
- VMのメモリー不足時にデッドロックを回避するための修正やその他のスレッド関連の修正を追加しました。
- タイムアウトを防ぐために、生成されるスレッドの数を減らしました。
- 条件付きプロファイルに関する問題を修正しました。
- シャットダウン中に例外を適切に捕捉します。
- 署名されていないモニターおよびアイデンティティ・ハッシュ・オフセットを使用し、それらが有効であることを保証します。
sun.nio.ch.Reflectの定数畳込みリフレクション・ルックアップ。IsolateAwareTruffleCompiler.tearDownIsolateOnShutdownのデッドロックを修正しました。- macOS固有の
perfプロファイラ・データの問題を修正しました。 - ネイティブ・イメージ・クラスの初期化ポリシーを修正します。
- SBOutliningのパラメータ数を制限する場合にスタック・スロット・サイズを考慮します。
- segfaultハンドラをより堅牢にします。
- ビルド時クラッシュの回避策を追加しました。
CEntryPointSnippets.initializeIsolate()の捕捉されない例外ハンドラおよびエラー処理を改善しました。- 生成時のサポートJDKを修正しました。
- Truffleフレームワーク:
- 正規表現言語は、UNTRUSTEDサンドボックス・ポリシーでは使用できません。
- JavaScript:
- NetSuite JavaScriptコードでループを脱最適化します。
- 基礎となるNode.jsをバージョン18.19.1にアップグレードしました。
- ライブラリ@rpath/libjsig.dylibがNode.jsネイティブ・スタンドアロン用にロードできなかったときの問題を修正しました。
- GraalVMアップデータ:
- 使用されなくなったか不要になった
guカタログを削除しました。
- 使用されなくなったか不要になった
Oracle GraalVM for JDK 17.0.10
(2024-01-16)
これは、Oracle GraalVM for JDK 17用の2024年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを17.0.10+11に更新しました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.3は、GraalVM for JDK 17.0.10で使用するように設計されています。
- コンパイラの修正:
- ループの不変数および定数に再関連付けできるバイナリ算術演算が再編成されました。
- ネイティブ・イメージ最適化レベルがリファクタリングされました。無効化できる機能としてデッド・ファイ・サイクル検出を公開しました。
- 条件付き移動最適化コスト計算が改善されました。
IntegerLessThanNodeにキャストする前にコンパイラがスタンプをチェックするようになりました。int範囲のstrideオーバーフローを処理することでループ展開の最適化が改善されました。checkcastおよびinstanceofの生成中の明示的なnullチェック例外が削除されました。- コンパイラが
AggressiveShrinkCollectionPolicyの最大Edenサイズを考慮するようになりました。
- ネイティブ・イメージの修正:
- 到達可能性ハンドラ登録用の同期データ構造が有効になりました。
- Windows 11およびWindows Server 2022を認識するようにOS検出コードが更新されました。
- macOS x64アーキテクチャ上のld64バージョンとの互換性の修正が追加されました。
- 分離ティアダウン中のクラッシュが修正されました。
- JFRのサポートが改善されました。
Thread.currentThread()ではなくPlatformThreads.getCurrentThreadOrNull()に切り替えられ、JVM.commit(long)の競合状態が修正されました。 - ネイティブ・イメージ・ビルダーのクラッシュ・ログにスタック・ウォーキング・ヒューリスティックが追加されました。
- 初期化されていないオブジェクト配列がガベージ・コレクタに認識されるようになりました。
mxツールの--disable-debuginfo-stripping引数が導入されました。- CPUに関連するXcode 15の互換性のバグが修正されました。
- G1ガベージ・コレクタが共有ライブラリとして構築されている場合、スタックが実行可能ファイルとして処理されます。
- ヘッダー・サイズを人為的に増やすオプションが追加されました。
__svm_version_infoにベンダー・バージョンが使用されます。- ネイティブ・イメージでは、メモリー使用量が
MemoryPoolMXBeanを介して問い合せられると、一貫した値がレポートされるようになりました。 UnlockExperimentalVMOptionsが有効になりました。EnterpriseAddressRangeCommittedMemoryProviderのチェックが修正されました。- OutOfMemoryErrorメッセージが改善されました。
- Epsilonガベージ・コレクタの場合、
HeapImpl.dirtyAllReferencesOfはno-opである必要があります。
- Truffleツールと言語の修正:
- ポリグロット
Contextをアクティブに入力した後、パラメータ分解を使用してJS-Isolate非同期関数をコールすると、NullPointerExceptionがスローされます。 - バージョン18.18.2への更新後に、必要なNode.js構造が更新されました。
- JSONパーサー・ライブラリorg.JSONがバージョン20231013にアップグレードされました。
UNTRUSTEDポリシーのPolyglotIsolateで未処理のOutOfMemoryエラーに対処しました。- 必須の実験プロパティ
debuggerIdの追加によって、Chrome DevToolsでGraalVMプロセスにアクセスできない問題が修正されました。 InteropByteBufferTest#testLargeInteropBufferがOutOfMemoryエラーで失敗しないようにするための修正が追加されました。
- ポリグロット
- GraalVM統合:
- Jipher JCEが10.32に、公開キー・インフラストラクチャ(PKI)が10.15に更新されました。
Oracle GraalVM for JDK 17.0.9
(2023-10-17)
これは、Oracle GraalVM for JDK 17用の2023年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVM for JDK 17が17.0.9+11に更新されました。JDK 17リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.0.2は、GraalVM for JDK 17.0.9で使用するように設計されています。
- Jipher
jceを10.30に、pkiを10.14に更新しました。 - コンパイラの修正:
- インダクション変数として誤って検出された代替
Phiを修正しました。 - macOS AArch64のコンパイルミスを修正しました。
- インダクション変数として誤って検出された代替
- ネイティブ・イメージの修正:
- 機能例外をユーザー・エラーとして再スローします。
- 外部コールに対して
exceptionTempを適切に設定します。 nullの場合は、RecordComponentsのアクセッサを無視します。- ビルド・レポートを改善しました。
- 非最終のJDKメソッドに、無停止の注釈を付けないでください。
- サンプラー起動時の不正なバッファ・プール調整を修正しました。
- 物理メモリー・サイズを積極的に初期化しました。
- Netty 5の「静的解析後に新しいVarHandleが見つかりました」を修正しました。
- Truffleフレームワークの修正:
- JITモードで分離を使用する場合とコンテキストがクローズされていない場合にエンジンを共有する場合の
NullPointerExceptionを修正しました。 BigInteger値から作成された切断されたpolyglot.Valueインスタンスは、isNumber()に対してデフォルトでfalseを返してはなりません。AbstractTruffleString.equals()メソッドのNullPointerExceptionを修正しました。PolyglotStackFramesRetrieverのデッドロックを修正しました。- MPKサポートが完了するまで、信頼できないコード・ハードウェア軽減は許可されません。
- JITモードで分離を使用する場合とコンテキストがクローズされていない場合にエンジンを共有する場合の
Oracle GraalVM for JDK 17.0.8
(2023-07-18)
これは、Oracle GraalVM for JDK 17用の2023年7月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVM for JDK 17が17.0.8+9に更新されました。JDK 17リリース・ノートを参照してください。
- Graalコンパイラ: オーバーフローするループをストリップ・マイニングしないようにカウントされたストリップ・マイニングの最適化が更新されました。
- ネイティブ・イメージ:
jvmstatパフォーマンス・データの初期化が修正されました。 - ネイティブ・イメージ: JDK Flight Recorder (JFR)イベント定数プールIDが修正されました。
- ネイティブ・イメージ: 一部のユーザー・エクスペリエンスの問題が修正されました。
- ネイティブ・イメージ: ビルド・レポートの分析結果が修正されました。
Oracle GraalVM for JDK 17.0.7
(2023-06-13)
- プラットフォームの更新
- 非推奨になった機能
- Javaおよびコンパイラの更新
- ネイティブ・イメージ
- JavaScriptおよびNode.js
- ポリグロット埋込み
- Truffle言語およびツールの実装
- Java on Truffle
- Python
- Ruby
- LLVM
- WebAssembly
プラットフォームの更新
- Oracle JDK 17.0.7+8に基づいたOracle GraalVM for JDK 17がリリースされました。「Java SE 17リリース・ノート」を参照してください
- Oracle GraalVMのライセンスは、Oracle JDKと連携されています。Oracle GraalVMは、GraalVM Free Terms and Conditions (GFTC) including License for Early Adopter Versionsに基づいてライセンスされるようになりました。Oracle GraalVMライセンスの詳細は、「Oracle Java SEライセンスに関するFAQ」を参照してください。
- GraalVMパッケージのネーミングを簡素化しました。
graalvm-jdk-<full java version>_<platform>-<arch>です(例: graalvm-jdk-17.0.7_macos-aarch64_bin.tar.gz)。 - Oracle GraalVMの新しいダウンロード場所は、Oracle Javaダウンロードです。以前のリリースについては、同じままです。
非推奨になった機能
次の機能およびコンポーネントは非推奨で、GraalVM for JDK 23で削除されます:
- Node.js
- LLVMランタイム
Javaおよびコンパイラの更新
- 低レイテンシが必要なワークロードや非常に大きなヒープ・サイズを使用するワークロードに対するZGCガベージ・コレクタのサポートが追加されました。#2149を参照してください。
- 非投機的モードを追加することにより、オプティミスティックなエイリアス解析が強化されました。(ループのベクトル化が改善されました。)一部のコード・シェイプは、以前はJITでのみベクトル化され、事前コンパイルではベクトル化されませんでした。ネイティブ・イメージのループのベクトル化が改善されたため、これらのコード・シェイプの差異がなくなり、コンパイラはより多くのループをベクトル化して高速に実行できるようになりました。
- 新しい最適化コンパイラ・フェーズのロギングが改善されました。最適化の決定をログおよびダンプ(JSONを使用するなど)するインタフェースが統合されました。最適化フェーズでは、
OptimizationLogを使用して変換をログに記録する必要があります。OptimizationLog.mdおよびProfdiff.mdで詳細を参照して、ホット・コンパイルで実行された最適化を比較する方法を学習します。 - オープンソースのIdeal Graph Visualizer (IGV)により、サードパーティのコンパイラや言語開発者が使用したり、貢献しやすくなります。詳細は、こちらを参照してください。
更新については、変更ログを参照してください。
ネイティブ・イメージ
パッケージングおよびプラットフォームの更新
- ネイティブ・イメージは、GraalVM for JDK 17の一部として出荷され、
gu install native-imageを介してインストールする必要がなくなりました。詳細は、こちらを参照してください。 - 既知の場所にVisual Studioインストールが見つかった場合、ネイティブ・イメージによってWindows上にビルド環境が自動的に設定されるようになりました。したがって、x64ネイティブ・ツール・コマンド・プロンプトでの実行は必須ではなくなりました。
- LinuxでのAWTライブラリの動的リンクが改善されました。LinuxでのAWTライブラリの静的リンクは、常に問題の原因となっていました。動的リンクでは、スタンドアロン・バイナリをなくして静的リンクで陥りやすい誤りを回避します。これは、WindowsでのAWTサポートによって示されるように、合理的なトレードオフです。リンカーは、「
jvmの複数の定義」のために失敗したり、LinuxでAWS/Swingアプリケーションのリンク・ステップでクラッシュしたりしなくなります。 - OpenSSL 3.0 FIPS上に実装されたJava暗号化アーキテクチャ(JCA)プロバイダであるJipher JCEは、GraalVMネイティブ・イメージをサポートするようになりました。FIPSで認められたアルゴリズムのみを使用するコンテキストで、ネイティブ・イメージを使用するJipherを有効にすることをお薦めします。まず、ドキュメントを参照してください。
新機能
- 自己完結型バンドルからネイティブ実行可能ファイルをオンデマンドでビルドする新機能が導入されました。新しいオプション
--bundle-create=<imagename>.nibは、<imagename>.nibファイル(ビルド・バンドル)およびlaunch.outputディレクトリとネイティブ実行可能ファイルを作成します。バンドル・ファイル<imagename>.nibは、ネイティブ実行可能ファイル(またはネイティブ共有ライブラリ)のビルドに必要なすべての情報を含む通常のJARファイルです。通常のnative-imageビルドとは対照的に、この操作モードは入力として1つの*.nibファイルのみを取ります。後で同じバージョンのGraalVMが使用された場合、実行可能ファイルは次を使用して再ビルドできます:native-image --bundle-apply=.../path/to/launch.nib最初のビルドと同じイメージ引数、環境変数、システム・プロパティ、クラスパスおよびモジュールパス・オプションを使用して、ネイティブ実行可能ファイルを再ビルドします。これは、ビルドに必要なすべての入力を単一のファイルにカプセル化する、安全で信頼性の高いソリューションです。詳細は、ネイティブ・イメージ・バンドルのリファレンス・マニュアルを参照してください。
- ネイティブ・イメージ・ビルド・プロセスのメモリー・フットプリントが改善されました。ビルダーは、同じマシン上で他の多くのプロセスが実行されている場合に、メモリー負荷を軽減するために使用可能なメモリーを考慮に入れるようになりました。また、多くの場合、消費されるメモリーが少なくなるため、メモリー不足エラーで失敗する可能性も低くなります。同時に、メモリー制限が14GBから32GBに増加しました。
- ネイティブ・イメージは、デフォルトでAMD64のx86-64-v3アーキテクチャをターゲットとし、ターゲットの互換性を指定する新しい
-marchオプションを提供します。ネイティブ実行可能ファイルが同じマシンまたは同じCPU機能を持つマシンにデプロイされる場合、最高の互換性のために-march=compatibilityを使用するか、最高のパフォーマンスを得るために-march=nativeを使用します。使用可能なすべてのマシン・タイプをリストするには、-march=listを使用します。 - ネイティブ・イメージで欠落しているメタデータのレポートが改善され、特別な例外がスローされるようになりました。ネイティブ・イメージは、到達可能性メタデータの欠落と、リフレクションAPIによってスローされた例外を区別しません。たとえば、クラスがクラスパス上にない場合、またはクラスのメタデータが存在しない場合にスローされる
ClassNotFoundExceptionです。ネイティブ・イメージ・ユーザーは、オプション-XX:ExitOnMissingMetadataを使用してメタデータ例外を捕捉し、プログラムをデバッグして、すべてのメタデータ・エントリが正しいことを保証できるようになりました。詳細は、こちらを参照してください。これは試験的機能であり、デフォルトではオンになっていません。 - ネイティブ・イメージにおいてリフレクションおよびリソース・メタデータの安全な構成が導入されました。たとえば、
java.lang.Class#getDeclaredMethodsreturnなどのリフレクティブ・メソッドは、他のリフレクティブ要素の到達可能性に基づきます。新しいメタデータを追加すると、到達可能な要素が増え、プログラムの機能が変わる可能性があります。メタデータ最適化の安全な構成により、native-imageビルダーでは、java.lang.Classに対するすべてのリフレクティブ・コールにメタデータ・エントリが必要であることが保証されるようになりました。詳細は、こちらを参照してください。 - 引数なしの
--initialize-at-build-timeオプションは使用できなくなりました。一時的な回避策として、-H:+AllowDeprecatedInitializeAllClassesAtBuildTimeオプションを使用すると、このエラーが警告に変わります。 - LLVMバックエンドを介したネイティブ・イメージ用の試験的なRISC-Vモードが追加されました。詳細は、このブログ投稿を参照してください。
- ネイティブ・イメージにおけるプロファイルに基づく最適化(PGO)が改善されました:
- プロファイルに基づく最適化に、コール・スタックを定期的に収集する新しいサンプリング・プロファイラが追加されました。サンプリング・プロファイラをオンにしてコール・スタックを収集するには、オプション
--pgo-samplingを使用します。このデータは、.iprofファイルに含まれます。PGOでインストゥルメントされた実行可能ファイルがビルドされると、サンプリング・プロファイラはデフォルトでオンになります(ただし、オプション-H:-SamplingCollectでオフにできます)。良好なプロファイル、ひいては良好なピーク・パフォーマンスを得るには、関連するワークロードを実行し、アプリケーションを適切にウォームアップする必要があります。 - "ホット"コード内のプロファイルのサンプリングに特化し、ホット・コンパイル・ユニットにより多くの最適化作業を投じるContext-Aware Inliner (CAI)最適化が実装されました。最適化されたイメージがPGO用にビルドされると、Context-Aware Inlinerが自動的にオンになります(ただし、オプション
-H:-AOTInlinerでオフにできます)。その結果、実行可能ファイルのサイズは2-7%小さくなり、ピーク・パフォーマンスが向上します。 - プロファイルのマージが改善され、事前にパッケージ化されたプロファイルが有効になりました。
- プロファイルに基づく最適化に、コール・スタックを定期的に収集する新しいサンプリング・プロファイラが追加されました。サンプリング・プロファイラをオンにしてコール・スタックを収集するには、オプション
- 機械学習(ML)ベースのプロファイル推論が追加されました。プロファイリングが無効になっている場合、ネイティブ・イメージのGraalコンパイラでは、事前にトレーニングされたMLモデルを使用して、制御分割ブランチのプロファイルを推論します。その後、推論されたプロファイルを使用して、プロファイルに基づく最適化が実行されます。Renaissance、Da Capo、Da Capo con Scalaなどの一部のベンチマークでは、この最適化によって、デフォルトのOracle GraalVM構成と比較してランタイム速度が最大6%向上します。ネイティブ実行可能ファイルのビルドをMLプロファイル推論で実行すると、バイナリ・サイズがわずかに(1%-2%)増加することが予想されます。この最適化は、Oracle GraalVMではデフォルトで有効になっています。無効にするには、
-H:-MLProfileInferenceオプションを使用します。 - ネイティブ・イメージのSBOMに、ランタイム・コンポーネント用の単一のSBOMコンポーネントが含まれるようになりました。このコンポーネントは、実行可能ファイルの
java.vm.versionプロパティを使用してバージョンを識別し、新しいgraalvm-native-image製品に属します。
ビルド出力の改善
- ビルダーは、実行可能ファイルの内容をよりよく理解するのに役立つビルド・レポートを生成できるようになりました。
-H:+BuildReportを使用して、この新しい試験的機能を試してください。 - 内部エラーのレポートが改善され、よりユーザーフレンドリになりました。明確なメッセージにより、ユーザーがどのように処理を進めればよいかが示されます。エラー・レポートを検査し、問題を解決できない場合は、エラー・レポートを添えてイシューを作成します。HotSpotにならって、エラー・レポートのデフォルトのファイル名は./svm_err_b_<timestamp>_pid<pid>.mdです。また、新しいオプション
-H:ErrorFileが追加され、エラー・レポートに別のファイル名を選択できます。#5414を参照してください。 native-imageビルド出力が調整されて、クラスではなくタイプ(プリミティブ、クラス、インタフェースおよび配列)をレポートするようになり、-H:BuildOutputJSONFileの出力スキーマが修正されました。native-image --versionコマンドの出力および様々なJavaプロパティ(java.vm.versionなど)は、OpenJDKに合せて調整されています。GraalVM Community Edition、Oracle GraalVMおよびGraalVMディストリビューションを他のベンダーと区別するには、java.vm.vendorを参照してください。
デバッグおよびモニタリング・エクスペリエンスの改善
- 引数なしでオプション
--enable-monitoringを使用することは非推奨になりました。このオプションは、デフォルトでallに設定されなくなりました。かわりに、有効にするモニター機能のリストを常に明示的に指定します(例:--enable-monitoring=heapdump,jfr,jvmstat)。 - ヒープ・ダンプが作成される場所を制御するオプション
-XX:HeapDumpPathが追加されました。 - アプリケーション・モニタリング用のJFRイベント(
ExecutionSample、ObjectAllocationInNewTLABおよびJavaMonitorInflate)が追加されました。 - Windowsでのデバッグが改善されました。デバッグ情報にJavaタイプに関する情報が含まれるようになりました。(Red Hatと共同。)
- JMXを介したリモート管理がネイティブ・イメージに実装されました。これは、オプション
--enable-monitoringで有効にできます(例:--enable-monitoring=jmxclient,jmxserver)。詳細は、こちらを参照してください。この機能は試験段階です。(Red Hatと共同。) - ネイティブ・イメージのJFRイベント・ストリーミングが可能になりました。この機能は試験段階です。(Red Hatと共同。)
その他の更新については、ネイティブ・イメージの変更ログを参照してください。
JavaScriptおよびNode.js
- Node.jsがバージョン18.14.1に更新されました。
BigInteger相互運用性サポートが追加されました。外部BigIntegersでは、JSBigIntセマンティクスを選択するために、BigInt関数を使用した明示的な型キャストが必要です。デフォルトのセマンティクスは、元の値や型に関係なく、すべての外部数値をJavaScriptNumber値のように扱います。算術演算子はdoubleへの暗黙的な非可逆変換を行います。比較演算子では、可能なかぎり正確な値の比較が試行されます。JavaScriptBigInt値をjava.math.BigIntegerホスト・オブジェクトに変換できるようになりましたが、ターゲットの型があいまいまたは存在しない場合は、一貫性のある型マッピングを確保するためにターゲットの型のマッピングが必要になる場合があります。- GraalVM JavaScriptランタイムにいくつかの新しいECMAScript提案が実装されました:
- イテレータ・ヘルパーの提案。試験段階のオプション
--js.iterator-helpersで使用可能になります。 - ShadowRealm APIの提案。試験段階のオプション
--js.shadow-realmで使用可能になります。 - WeakMapキーとしてのシンボルの提案。ECMAScriptステージング・モード(
--js.ecmascript-version=staging)で使用できます。 ArrayBuffer.prototype.transferなどの提案。ECMAScriptステージング・モード(--js.ecmascript-version=staging)で使用できます。- コピーによる配列の変更の提案。ECMAScriptステージング・モード(
--js.ecmascript-version=staging)で使用できます。
- イテレータ・ヘルパーの提案。試験段階のオプション
ノート: Node.jsサポートは非推奨としてマークされており、将来のリリースで削除されます。
その他の更新については、プロジェクトの変更ログを参照してください。
ポリグロット埋込み
- 今リリースは、コード・サンドボックスでの信頼できないアプリケーションの実行をサポートする最初のリリースです。4つの異なるサンドボックスのレベル(
ISOLATED、UNTRUSTED、TRUSTED、およびCONSTRAINED)を持つサンドボックス・ポリシーContext.Builder#sandbox(SandboxPolicy)が実装され、ユーザーがホスト・アプリケーションとゲスト・コードの間にセキュリティの境界を確立できるようになりました。ポリシーは、Engine.Builder#sandbox(SandboxPolicy)またはContext.Builder#sandbox(SandboxPolicy)ビルダー・メソッドに渡すことによって設定されます。ホスト・コードは、UNTRUSTEDポリシーなどを使用して、信頼できないゲスト・コードを実行できます。ホスト・コードは、相互に保護されるゲスト・コードの相互に信頼されないインスタンスを複数実行できます。詳細は、ポリグロット・サンドボックス化のガイドを参照してください。コード・サンドボックスは現在、JavaScriptでのみサポートされています。 - コード・サンドボックス実装に関連して、ゲスト・アプリケーションのリソース消費を測定し、現実的なサンドボックス・パラメータを取得するための新しいオプション
TraceLimitsが追加されました。 IOAccessAPI(多言語コンテキストのIOアクセス構成)が追加されました。IOアクセス構成によって、ゲスト言語がホストIOにアクセスする方法が決まります。新しいIOAccessクラスは、ホストIOアクセスを無効にしたり、フル・ホストIOアクセスを有効にするための事前定義済の構成を提供します。カスタム構成は、IOAccessビルダーを使用して作成できます。- ポリグロット値APIに
java.lang.BigIntegerが追加されました。デフォルトでは、java.lang.BigInteger型のすべてのホスト値は以前とは異なり数値(Value.isNumber())として解釈されるようになりました。以前の動作に戻すには、HostAccess.Builder.allowBigIntegerNumberAccess(boolean)をfalseに設定します。長い値に収まらない数値を解釈するための言語サポートは異なる場合があります。JavaScriptなどの一部の言語では、ホストの大整数を明示的に変換する必要がある場合があります。RubyやPythonなどのその他の言語では、明示的な変換を行わずに大整数を使用できます。同じことが、ゲスト言語間で渡される値にも当てはまります。#2737を参照してください。 - ネイティブ・イメージにTruffle言語を埋め込むための言語リソースの自動コピーが追加されました。ドキュメントはこちらで提供されています。
変更の完全なリストは、changelogを参照してください。
Truffle言語およびツールの実装
- パフォーマンス向上のため、Truffle DSLにいくつかの新機能が実装されました。特に、Truffleノードを自動的にオブジェクト・インライン化できる
@GenerateInlineという新しい注釈が導入されました。オブジェクトがインライン化されたTruffleノードはシングルトンになるため、メモリー・フットプリントを削減します。これは、キャッシュされたノード・バージョンまたはキャッシュされていないノード・バージョンを生成する@GenerateCachedおよび@GenerateUncachedと同様に機能します。詳細は、ドキュメントを参照してください。
パフォーマンス向上に寄与するその他の更新は次のとおりです:
- 更新されたTruffle DSLノードは、特殊化中にノードのロックが不要になり、初回実行パフォーマンスが向上しました。CASスタイルのインライン・キャッシュ更新は、ガードで
CallTarget.call(...)をコールするときにデッドロックを回避するために使用されるようになりました。インライン・キャッシュは重複値がないことを保証し続け、競合状態の影響を受けません。言語の実装では、競合が減少すると、言語の他のスレッドセーフティの問題が明らかになる可能性があることに注意してください。 - 生成された状態用のフィールドをマージし、ビット・セットを除外し、特殊化データ・クラスの生成を改善してアクティブ化の見込みを考慮することで、Truffle DSLノードのメモリー・フットプリントが改善されました。最適な結果を得るには、特殊化をアクティブ化の見込みに従って順序付けする必要があります。
- 列挙型のキャッシュされたパラメータ値を状態ビットセットに自動的にインライン化することで、メモリー・フットプリントが改善されました。
- Truffle DSLは、推奨事項についてさらに多くの警告を発するようになりました。たとえば、インライン化の機会、キャッシュ共有、またはキャッシュ・イニシャライザを
@NeverDefaultとして指定する必要がある場合に警告を発します。移行作業を容易にするために、Javaパッケージの警告を一時的に抑制する新しい方法が追加されました。考えられる警告のリストと詳細な使用方法については、ドキュメントを参照してください。 - 閉じられていないポリグロット・エンジンは、VMの停止時に自動的に閉じられなくなりました。VMとともに終了します。その結果、VMが停止した場合、
TruffleInstrument#onDisposeは閉じられていないエンジンでアクティブなインストゥルメントに対してコールされません。インストゥルメントが廃棄前に特定のアクション(たとえば、ある種のサマリーの出力)を行うことになっている場合、TruffleInstrument#onFinalizeで実行するようにしてください。 - コード・サンドボックスの制限を制御するポリシーが実装されました。デフォルトでは、言語およびインストゥルメントは
TRUSTEDサンドボックス・ポリシーのみをサポートします。- 言語でより限定的なサンドボックス・ポリシーのターゲットを指定する場合は、次のことが必要です:
TruffleLanguage.Registration#sandbox()を使用して、必要とする最も厳格なサンドボックス・ポリシーを指定します。- 各オプションについて、言語は、
Option#sandbox()を介してオプションを使用できる最も制限の厳しいサンドボックス・ポリシーを指定する必要があります。デフォルトでは、オプションはTRUSTEDサンドボックス・ポリシーを持ちます。 - 言語に追加の検証が必要な場合は、
TruffleLanguage.Env#getSandboxPolicy()を使用して現在のコンテキスト・サンドボックス・ポリシーを取得できます。
- インストゥルメントでより制限的なサンドボックス・ポリシーをターゲットにする場合は、次のことを行う必要があります:
TruffleInstrument.Registration#sandbox()を使用して、必要とする最も厳格なサンドボックス・ポリシーを指定します。- 各オプションについて、インストゥルメントは、
Option#sandbox()を介してオプションを使用できる最も制限の厳しいサンドボックス・ポリシーを指定する必要があります。デフォルトでは、オプションはTRUSTEDサンドボックス・ポリシーを持ちます。 - インストゥルメントに追加の検証が必要な場合は、
TruffleInstrument.Env#getSandboxPolicy()を使用してエンジンのサンドボックス・ポリシーを取得できます。
- 言語でより限定的なサンドボックス・ポリシーのターゲットを指定する場合は、次のことが必要です:
その他の更新については、Truffleの変更ログを参照してください。
Java on Truffle (Espresso)
新機能:
- Truffle InteropLibrary
has/getMetaParentsAPIが完全に実装されました。 - interopを介して
espressoをコールすると、外部Instant、TimeZone、Time、Date、Durationが有効になります。
改善:
- interopを介してオーバーロード・メソッドおよびVarargsメソッドをコールできるようになりました。
- 外部例外との相互運用性が改善されました。スタック・トレースが使用可能になり、型マッピングを使用して例外を明示的にマップできるようになりました。
Python
パフォーマンスの向上:
- デフォルトでは完全ネイティブ実行を使用するPython C APIインタフェースの新しい実装が追加されました。これにより、ネイティブ・コードに多くの時間を費やす一部の拡張機能(SciPy、PyTorchなど)とのパフォーマンスおよび互換性が向上しますが、Python/ネイティブ境界を頻繁に越えるワークロードに悪影響を及ぼす可能性があります。拡張機能のビルドおよび実行方法を制御する新しいオプション
python.NativeModulesおよびpython.UseSystemToolchainがあります。新しいデフォルトでは、GraalVMに付属しているLLVMツールチェーンではなく、ホスト・システムのツールチェーンを使用して拡張機能をビルドし、すべてのモジュールをネイティブで実行します。古い動作を取得するために新しいランチャ(graalpy-lt)を使用できます。これはデバッグに役立ちます。 - Webサイトで報告されるパフォーマンス数値は、コミュニティの
pyperformanceベンチマーク・スイートの結果に基づいており、CPythonやJythonに対するGraalPyの幾何平均速度向上が測定されています。これにより、結果の比較と再現が容易になります。
プラットフォームの更新:
- Windowsでの基本的なGraalPyワークロードのビルドおよび実行が実装されました。これにより、Windowsユーザーは、特にJavaへの埋込み用にGraalPyをビルドして使用できます。
- 組込みモジュールとしてVirtualenvのGraalPyプラグインが追加されたため、GraalPyで
virtualenvを使用した仮想環境の作成がすぐに機能できるようになりました。 - ベースGraalPyに委任される生成されたシェル・スクリプトではなく、シンボリック・リンクを使用して仮想環境を作成するように、組込みの
venvモジュールが更新されました。
互換性の向上:
- 言語バージョンおよび標準ライブラリが3.10.8に更新され、最新のモジュールおよびパッケージと互換性を持つようになりました。
- CPythonと一致するようにGraalPyのディストリビューション・レイアウトが更新されました。これにより、GraalPyのライブラリの場所を検出するために様々なビルド・システムに必要なパッチの数が削減されます。
numpyおよびpandasバージョンが更新されました。scipyおよびscikit_learnがginstallで実装されるようになりました。
更新の完全なリストは、プロジェクトの変更ログを参照してください。
Ruby
新機能:
- Ruby 3.1.3に更新されました。
- 外部の大整数がサポートされるようになり、すべての
Numeric演算子を使用できます。
パフォーマンス:
- YAMLを解析するときのウォームアップを改善するために、
psych用のシステムlibyamlが使用されるようになりました。つまり、libyamlは依存関係になりました。LibYAMLのインストール方法を参照してください。 - オブジェクトにラップされたネイティブ構造のマーキングは、メモリーのオーバーヘッドを削減するために、C呼出しの終了時に行われるようになりました。
cloneUninitialized()を実装することで、コール・ターゲットの分割(コピー)が最適化されました。Process.pidは、$$のようにプロセスごとにキャッシュされるようになりました。- 特定のコール・サイトでの複数のコールで増大する
Arrayを構築するメソッドの繰返し脱最適化が修正されました。
バグの修正:
- macOSでの
spawn(..., fd => fd)が修正されました。macOSのバグが原因で機能しませんでした。 rb_gc_register_address()/rb_global_variable()が最新の値を読み取るように修正されました(#2721、#2734を参照)。
変更の完全なリストは、プロジェクトの変更ログを参照してください。
LLVM
- LLVMツールチェーンがバージョン15.0.6に更新されました。
musl libcがバージョン1.2.3に更新されました。- LinuxのAArch64アーキテクチャに
long double(128ビット浮動小数点)が実装されました。
ノート: LLVMランタイム・サポートは非推奨としてマークされており、将来のリリースで削除されます。