Oracle GraalVM for JDK 21.0.5
(2024-10-15)
これは、Oracle GraalVM for JDK 21用の2024年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを21.0.5+9に更新しました。JDK 21リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.5は、GraalVM for JDK 21.0.5で使用するように設計されています。
- Graalコンパイラ:
- ループ終了の実装: 値ノードとして使用される例外ノードはすべて、スケジュールの開始ノードを必要とします。
StringBuilderOverflowTest#testInSubprocess
の失敗を修正しました。-XX:-CompactStrings
が有効な場合は、StringBuilderOverflowTest
をスキップします。- 使用されていない
@Fold
メソッドの検出が改善されました。
- ネイティブ・イメージ:
- カスタム
UnmanagedMemorySupport
実装の登録のサポートが追加されました。 - ネイティブ・イメージのツールチェーン検出で、Intel oneAPI DPC++/C++ Compiler (ICX)コンパイラのサポートが追加されました。
- OS名の空白を無視するように
ProfileInferenceFeature.checkOsVersion()
関数を更新しました。 InheritedChannel.inetPeerAddress0()
のクラッシュを修正しました。- VM内部コードでの大規模な配列割当てが
OutOfMemoryErrors
をトリガーしないようにします。 - ランタイム・ブート・モジュール・レイヤーに
Main
モジュールが含まれているかどうかを確認するテストが追加されました。 - 存在しないパッケージがオープン/エクスポートされた場合に互換性を確保するための統合テストが追加されました。
- 例外ハンドラへの最適化解除を修正しました。
- デバッグ情報ジェネレータのロギング・オーバーヘッドが削減されました。
- 分析が状況依存の場合の
LoadFieldNode
のStrengthenGraphs
を修正しました。 - 様々なJNI関連のバグ修正を追加しました。
- リフレクティブ・コール中に
NoClassDefFoundError
を確認するためのチェックが追加されました。 - JavaMonitorをjdk-24+11に更新しました。
- シリアルGCヒープ検証が改善され、その他のGC関連の変更が追加されました。
Provider.Service.constructorCache
フィールドをリセットしました。ValueConversions
でキャッシュを積極的に初期化しました。- reachability-metadata.json処理のJDK 21へのバックポート。
- カスタム
- Espresso:
ecj
コンパイラでコンパイルされていないJava (ECJ)テスト用のEclipseコンパイラを無効にしました。
- JavaScript:
- コンテキスト境界を越えて表示されるエラー・メッセージ。
- モジュールがすでに評価されている場合でも、I/O権限が必要です。
- JavaScriptインタプリタによってTRegexが
IndexOutOfBoundsException
で失敗する問題を修正しました。 - 基礎となるNode.jsをバージョン18.20.4にアップグレードしました。
- GraalWasm:
- WebAssemblyキャッシュを修正しました。
- TRegex:
- OracleDBFlavorのグループ・エスケープで欠落している再帰的backrefガードが修正されました。
- JavaScriptインタプリタによってTRegexが
IndexOutOfBoundsException
で失敗する問題を修正しました。
Oracle GraalVM for JDK 21.0.4
(2024-07-16)
これは、Oracle GraalVM for JDK 21用の2024年7月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを21.0.4+8に更新しました。JDK 21リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.4は、GraalVM for JDK 21.0.4で使用するように設計されています。
- Graalコンパイラ:
- 常に非最適化する
FixedGuard
の簡略化を修正しました。 AMD64NormalizedUnsignedCompareOp
で正しい比較サイズを使用する修正を追加しました。- SIMD再解釈スタンプ折りたたみを修正しました。
- より多くの浮動小数点確率の比較にepsilonを追加しました。
AArch64AtomicMove
を修正しました。VectorConsumerPhase
のクラッシュを修正しました。CaptureStateBegin
の後続でループをストリップ・マイニングしないように、ストリップ・マイニング最適化を改善しました。VectorConsumerPhase
のクラッシュを修正しました。- 内部から外部への正しい状態を使用するように、カウントされたストリップ・マイニング最適化を改善しました。
- 終了するオーバーフローが必要な符号なしのループはカウントしないでください。
- マスクされたnegate strideに対して
isConstantStride
を適切に実装しました。 - 様々な命令のEVEXエンコーディングのテストを追加しました。
- 常に非最適化する
- ネイティブ・イメージ:
- プロファイリングのすべての情報を含めるように
-g
オプションを更新しました。objcopy
stripコマンドの問題を修正しました。 - 同期ブロックの入力中にメモリーが不足するテスト・ケースを追加しました。
- 特にティアダウン中のOOMEに対して、参照処理がより堅牢になりました。
OutOfMemoryError
関連の修正をいくつか追加しました。- 低層の最後にある
OpaqueValueNodes
を削除しました - CCharPointerを"signed char"から"char"に変更しました。
isRegisteredDeoptEntry
のNPEを修正しました。-H:-ParseRuntimeOptions
が指定されている場合に、G1引数の解析をスキップするように実装されました。- オプションで、VM内部コードでは
OutOfMemoryErrors
を無視します。 getpwuid
が削除され、getpwuid_r
が優先されるようになりました。- Epsilon GCの使用時に特定のGCテストを除外するチェックを追加しました。テスト・インフラストラクチャが改善されました。
GCHeapSummary
JFRイベントでレポートされる値を修正しました。- ビルド・レポートの内訳チャートのデータ制限を修正しました。
deoptStub
ではスタック・ポインタを整列させます。HeapImplMemoryMXBean.getHeapMemoryUsage()
の一貫性の問題を修正しました。- ランタイム・モジュール・レイヤー・テストを追加しました。
- イメージ・ヒープ内の配列ベースのバッファに対して
Buffer.address
フィールドを再計算するようにしました。 PrintMethodHistogram
のNullPointerException
を修正しました。- 定期的なネイティブ・イベントの物理メモリー使用量およびJFRテストに対する部分的なサポートを追加しました。
- 静的フィールドのかわりにインスタンス・フィールドを使用するようになりました。
IsolatedSpeculationReasonEncoding
に非暗号化ハッシュを使用するようになりました。- レコードはWordタイプを使用できません。
musl libc
なしで静的なネイティブ実行可能ファイルをビルドする場合にエラーを報告するチェックを追加しました。- 黄色のゾーン・コードをVM内部コードとして扱わないでください。
- プロファイリングのすべての情報を含めるように
- Truffleフレームワーク:
- Linuxでの
FileSystemsTest#testSetAttribute()
の失敗を修正しました。 - ポリグロット実装がない場合のエラー・メッセージが改善されました。
LoggingTest#testDisableLoggersSingleContext
は無効になりました。this.owningRoot
がnullであったため、com.oracle.truffle.polyglot.InternalResourceRoots$Root.path()
を起動できなかった問題を修正しました。- speculateコール後に
SpeculationReason
を再利用できなかった問題を修正しました。 - 静的分析に役立つ具象
VirtualFrame
戻り型を使用して行われました。
- Linuxでの
- Java on Truffle (Espresso):
- JDWPメソッドの起動を修正しました。
- デバッガがローカル変数表を要求したときのJDWPのNPEを修正しました。
- まだロードされていないコード内でのステップ実行時のEspresso JDWPのシングルステップ実行を修正しました。
- JDWPのイントリンシックJavaメソッドのトレース実行を修正しました。
- JavaScript:
- 基礎となるNode.jsをバージョン18.20.2にアップグレードしました。
- JSノードのイントロスペクション・データは無効になりました。
- 負の索引で要素を設定するときの潜在的な
ArrayIndexOutOfBoundsException
を修正しました。 Instanceof
演算子では、左側が(外部)オブジェクトかどうかをチェックする必要があります。- デフォルトの型付き配列サイズ制限が2GBに増加しました。
- ツール:
- サンプラがすでにクローズされている場合に中断を記録しないようにCPUSamplerを更新し、他の様々なCPUSampler修正を追加しました。
- TRegex:
- OracleDBフレーバとの互換性のために、match-beginおよびmatch-endの位置アサーションのサポートを追加しました。
Oracle GraalVM for JDK 21.0.3
(2024-04-16)
これは、Oracle GraalVM for JDK 21用の2024年4月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを21.0.3+7に更新しました。JDK 21リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.3は、GraalVM for JDK 21.0.3で使用するように設計されています。
- Graalコンパイラ:
Integer.divideUnsigned
のマジック番号の計算を修正しました。- 1つのコンポーネントを反転できない場合、SIMDStampを反転するときに
null
を返します。 AMD64SHA256AVX2Op
で、強制終了されたすべてのXMMレジスタを@Temp
としてマークします。- 1つのコンポーネントを反転できない場合、SIMDStampを反転するときに
null
を返します。 - AArchの末尾コール・トランポリンへのサポートされているジャンプ距離が128MBに増加しました。
- 初期化ベクトル(IV)に修正を追加: オーバーフローしない定数プロパティのみが定数である必要があります
- カウントされたストリップ・マイニング最適化の修正:
long
からint
へのオーバーフロー・ロジックを改善しました- ループ終了状態が必ず一意となるようにします
- 絞込みの比較の誤った最適化のテストを追加します。
CompilationResult.methods
に重複が含まれていないことを確認するチェックを追加しました。- 固定読取りノードは、nullチェックとして使用されない場合にのみ削除する必要があります。
- スタック・サイズが正しくない未解決の脱最適化の
FrameStates
を修正しました。 - DOMツリーを尊重するために、ガードが
MoveGuardsUpwards
にアタッチされていることを確認します。 - SIMDベクトル化を削除しました。
- Oracle Database Multilingual Engineでのメモリー分離のためのMPK実装用のSVMフック。
- ネイティブ・イメージ:
-H:Path
検証は、非バンドル・モードでのみ使用します。- デバッグ情報の破損につながる可能性のあるデバッグ・セクションの配置を修正しました。
- JITコンパイル・コードのライフサイクルが変更されました。
- クラッシュ・ログの改善を追加しました。
sun.nio.ch.Reflect
に定数畳込みリフレクション・ルックアップを追加しました。- 最近起動したプラットフォーム・スレッドで
getStackTrace
をコールすると、クラッシュする可能性があります。 - プロファイル・バージョン・チェックを無視するオプションが導入されました。
@SVMTests
にカスタム例外ハンドラを使用します。- ビルドが成功した場合にのみ、追加のアーティファクトを作成します。
- AMD CPUの
Cpuid1Ecx
機能解析を修正しました。 _MSC_FULL_VER
を前処理して、cl.exe
バージョン情報を検出します。IsolateArgumentParser
のバグを修正しました。- 新しいオプション
-H:+PGOPrintUnmatchedPercentage
が導入されました。 - JVMTI関連の置換を常に適用します。
- ネイティブ・イメージ・エージェント・トレース・ファイル内の特定のJSON値の出力を正しく処理します。
- VMのメモリー不足時にデッドロックを回避し、その他のスレッド関連の修正を行いました。
ReportFatalErrorOnOutOfMemoryError
が導入されました。- PGOプロファイリング用のダンプおよびリセット・メソッドが導入されました。
- 署名されていないモニターおよびアイデンティティ・ハッシュ・オフセットを使用し、それらが有効であることを保証します(アサートしません)。
Heap.allowPageSizeMismatch()
を削除し、物理メモリー・サイズを設定するためのメソッドを提供しました。- 脱最適化ターゲットのマクロノードを阻止します。
- G1のコンテナ・サポート関連の修正と、ランタイム・ページ・サイズがビルド時ページ・サイズより小さいことのサポートを追加しました。
Thread
オブジェクトなしで最近開始されたスレッドとVMOperation
中のNPEを処理します。- JITコンパイルには起動プロファイルは必要ありません。
- ラムダ・クラス名の形式をJDK名形式と一致させます。
- タイムアウトを防ぐために、生成されるスレッドの数を減らしました。
- 条件付きプロファイルに関する問題を修正しました。
- アプリケーション・モジュール名の検出を統合します。
- シャットダウン中に例外を適切に捕捉します。
IsolateAwareTruffleCompiler.tearDownIsolateOnShutdown
のデッドロックを修正しました。- ビルド時クラッシュの回避策を追加しました。
CompilationIsolateOptions
が追加されました。- segfaultハンドラをより堅牢にします。
- リソース・バンドルの引数のないコンストラクタが存在しない場合の障害を修正しました。
- メソッド・ハンドルの組込み化が改善されました。
CEntryPointSnippets.initializeIsolate()
の捕捉されない例外ハンドラおよびエラー処理を改善しました。LogManager
シャットダウン・フックは他のすべてのシャットダウン・フックの後に実行します。- SBOutliningのパラメータ数を制限する場合にスタック・スロット・サイズを考慮します。
- 非DarwinではなくDarwinをチェックするように
aarch64registerconfig
を切り替えました。 - オプション
engine.CompilerThreads
およびengine.CompilationFailureAction
をUNTRUSTEDサンドボックス・ポリシーで使用可能にします。 - 失敗するJFRテストを修正しました。
- ランタイム・コンパイルに不要な
NodeSourcePosition
を回避します。
- Truffleフレームワーク:
- クラス・ローダーが無効になっていても失敗しないように修正を追加しました。
- Truffleサンドボックス・モードで
WeakReference
オブジェクトがリークされないようにするための修正が追加されました。 - 内部リソース・キャッシュが
polyglot.engine.resourcePath
システム・プロパティによってオーバーライドされているときのアサーション・エラー。 - 最新のLTSリリースへの互換性のないNFIライブラリの変更。
- コンテキスト・リスナーの競合を修正するために
PolyglotInstrument#readyForContextEvents
が導入されました。 - ThrowableTracer#traceErrorをインライン化しないでください。
- 実行時コンパイル・フェーズに
InsertGuardFencesPhase
が追加されました。 - コンパイルを単独で使用する場合のコンパイル失敗の診断中の
NullPointerException
。
- Javascript:
- 内部パーサー・エラーを
SyntaxError
として再スローしないでください。 - NetSuite Javascriptコードでループを脱最適化します。
AbstractJSObjectArray.setElementImpl
で可能性のある無限再帰を修正しました。- 基礎となるNode.jsをバージョン18.19.1にアップグレードしました。
- Node.js JVMスタンドアロンに含まれないwasm.jarを修正しました。
- 内部パーサー・エラーを
- Java on Truffle (Espresso):
- Espresso相互運用ノードの注釈プロセッサが修正されました。
- GraalVM統合:
- JVMスタンドアロンからメイン・コンポーネントのライブラリ構成を除外します。
Oracle GraalVM for JDK 21.0.2
(2024-01-16)
これは、Oracle GraalVM for JDK 21用の2024年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- Oracle GraalVMが構築されているOracle JDKリリースを次に更新しました:
- 21.0.2+13 (Java 21ベースのOracle GraalVMの場合)。JDK 21リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.2は、GraalVM for JDK 21.0.2で使用するように設計されています。
- コンパイラの修正:
- ループの不変数および定数に再関連付けできるバイナリ算術演算が再編成されました。
- コンパイルの失敗を原因とするSulongベンチマークの失敗が修正されました。
- 条件付き移動最適化コスト計算が改善されました。
- Pythonコードを使用してJavaホスト・アプリケーションのBouncy Castleライブラリを事前にコンパイルするときに、
ConditionalMoveOptimizationPhase
でStackOverflowError
が発生するバグが修正されました。 - AArch64アーキテクチャのサポートが改善されました:
BranchOp
によるFarBranch
の発行が可能になり、AArch64 HotSpotでのnull定数コード生成がより汎用的になりました。 - ガード・アンカーによる
CaptureStateBegin
が確実になりました。 IntegerLessThanNode
にキャストする前にコンパイラがスタンプをチェックするようになりました。- Epsilonガベージ・コレクタでは、
HeapImpl.dirtyAllReferencesOf
をno-opにする必要があります。 ValueAnchorNode
の実装が簡素化されました。checkcast
およびinstanceof
の生成中の明示的なnullチェック例外が削除されました。
- ネイティブ・イメージの修正:
- Windows 11およびWindows Server 2022を認識するようにOS検出コードが更新されました。
- 最大ヒープ・サイズを超えるVM操作を許可するオプションが追加されました。
- アサーションが有効な場合の
-XX:+PrintGCSummary
の問題が修正されました。 - 分離ティアダウン中のクラッシュが修正されました。
- ネイティブ・イメージで、クラッシュしたスレッドが無視されるようになりました。
- OutOfMemoryErrorメッセージが改善されました。
EnterpriseAddressRangeCommittedMemoryProvider
のチェックが修正されました。- ネイティブ・イメージでは、メモリー使用量が
MemoryPoolMXBean
を介して問い合せられると、一貫した値がレポートされるようになりました。 mx
ツールの--disable-debuginfo-stripping
引数が導入されました。- 不適切な場所に格納されている
native-image
JSONプロパティの処理が修正されました。 System.console().readPassword
の失敗を防ぐ修正が追加されました。- BFD名前マングラ#7423におけるプリミティブ型のマングリングが向上しました。
- ドライバがイメージの場合に、
native-image --bundle-create,container
コマンドが失敗する問題が修正されました。 - NIO/cgroupsコードに初期化サイクルの分岐が作成されました。
- G1ガベージ・コレクタが共有ライブラリとして構築されている場合、スタックが実行可能ファイルとして処理されます。
PointsToAnalysisMethod.getContextInsensitiveVirtualInvoke
での一時的な保証の失敗が修正されました。- JFRのサポートが改善されました。
Thread.currentThread()
ではなくPlatformThreads.getCurrentThreadOrNull()
に切り替えられ、JVM.commit(long)
の競合状態が修正されました。 FrameInformation
を必要とするメソッドに対して、DeoptTargets
が確実に生成されるようになりました。- ネイティブ・イメージ・ビルダーで、同期データ構造を使用して到達可能性ハンドラが登録されるようになりました。
- クラッシュ・ログをダンプする非同期シグナル安全な方法が追加されました。
- ヘッダー・サイズを人為的に増やすオプションが追加されました。
- ネイティブ・イメージのクラッシュ・ログに使用されるスタック・ウォーキング・ヒューリスティックが修正されました。
- Windowsの
joinThreadUnmanaged
が修正されました。 __svm_version_info
にベンダー・バージョンが使用されます。- ビルダーで
AccessControlContext
スタックにThreadLocal
が使用されるようになりました。 - MANIFESTファイルにClass-Path属性が含まれる場合のクラスパスの順序が修正されました。
- イメージの実行時に、ブートストラップ・メソッドの実行と動的定数の実行がサポートされるようになりました。
- ロジックを要求するG1ガベージ・コレクタ・スレッドが修正されました。
- 例外処理が失敗した場合に、ネイティブ・イメージでクラッシュ・ログが出力されるようになりました。
- null値がある
arraycopy
のclinit
シミュレーションが修正されました。 - 登録されている場合にのみ、ネイティブ実行可能ファイルに署名者が含まれるようになりました。
@Unknown*Field
という注釈が付いたフィールドには、シャドウ・ヒープを使用しないでください。
- Truffleフレームワークの修正:
- 不明瞭化していないGraalVMと、不明瞭化したMavenアーティファクトを混在させると失敗します。
- 不適切な場所に格納されているjson-23.1.0.jarのnative-image.propertiesが処理されます。
- JSONパーサー・ライブラリorg.JSONがバージョン20231013にアップグレードされました。
- Sulong上で動作するプラットフォームにおけるEspressoコンテキスト生成の低下が修正されました。
- 実行時コンパイルにおけるリンクされていないタイプの処理が修正されました。
- クラスパスの分離がデフォルトで無効になりました。
- 非連鎖のポリグロット・バージョン・チェックが追加されました。
- 失敗して例外をスローするアサーション・トリガー・チェックが追加されました。
- グローバル
PolyglotIsolate.Lazy#hostToGuestObjectReferences
が、HSContext
ごとに変更されました。
- ツール:
- 必須の実験プロパティ
debuggerId
が追加され、/json/listパスのGETが処理されるようになりました。
- 必須の実験プロパティ
- Javascript:
- バージョン18.18.2への更新後に、必要なNode.js構造が更新されました。
- ホスト・コールからコールされたクローズ時に、明示的に入力されたコンテキストが自動的に終了しないようになりました。
- LLVM:
- Xcode 15でビルドされている場合、LLVMの初期化が失敗します。
- IOアクセスが拒否されると、Sulongライブラリのロードが低下します。
- Java on Truffle (Espresso):
EspressoForeignList
内の外部フィールドが不要になりました。- 不足していたEspressoアーティファクトがMavenに追加されました。
- Espressoオブジェクトを処理しない
ToEspresso
コレクション型ノードが修正されました。 - 外部例外とカスタム型コンバータについて、型コンバータの組合せが修正されました。
- Python:
- GraalVM Community Editionでのみ動作するPython JVMスタンドアロンが修正されました。
- Ruby:
- スタンドアロンですべてのTruffleRubyテストが実行されます。
- WebAssembly:
- GraalWasmからのファイル・システム・アクセス。
- TRegex:
- OracleDBフレーバが追加されました。
- GraalVM統合:
- Jipher JCEが10.32に、pkiが10.15に更新されました。
- デプロイされたアーティファクトのリストが修正されました。
- ターゲット呼出しのないラムダ。
Oracle GraalVM for JDK 21.0.1
(2023-10-17)
これは、Oracle GraalVM for JDK 21用の2023年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、注目すべきバグ修正(下を参照)、およびプラットフォーム更新が含まれます。
- Oracle GraalVM for JDK 21が21.0.1+12に更新されました。JDK 21リリース・ノートを参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.1は、GraalVM for JDK 21.0.1で使用するように設計されています。
- コンパイラの修正:
- 事前コンパイルに
RuntimeRandomness
を使用するよう、定数ブラインディングを変更しました。 - AArch64アーキテクチャの
BranchOp
に、FarBranch
サポートを追加しました。
- 事前コンパイルに
- ネイティブ・イメージの修正:
- 使用していないメモリーをコミット解除するときに、プロセスがクラッシュする問題を修正しました。
- スタック境界を特定できない場合のために、
CEntryPointError
を追加しました。 - JDK固有の不要なJavaフライト・レコーダ・コードを削除しました。
- macOSで
ProcessBuilder
を使用して、不定期に発生するクラッシュを修正しました。
Oracle GraalVM for JDK 21
(2023-09-19)
- プラットフォームとディストリビューション
- 削除された機能
- 非推奨になった機能
- JDK 21の新機能
- Javaおよびコンパイラ
- ネイティブ・イメージ
- GraalVM SDKの分割
- ポリグロット埋込み
- JavaScriptおよびNode.js
- Java on Truffle
- LLVM
- Truffle言語およびツールの実装
プラットフォームとディストリビューション
- Oracle JDK 21をベースとしたOracle GraalVM for JDK 21をリリースしました。JDK 21リリース・ノートを参照してください。
- 言語ランタイムをスタンドアロン・ディストリビューションとしてリリースしたため、GraalVM JDKには言語ランチャはありません。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。GraalVMのエディションを区別できるよう、GraalVM Community Editionバージョンの名前には、接尾辞
-community
が付いています(例:graaljs-community-<version>-<os>-<arch>.tar.gz
)。ランタイム・モードを区別するために、JVMスタンドアロン・タイプの名前には、-jvm
という部分があります。スタンドアロン・ディストリビューションは、GitHubの対応する言語リポジトリから入手できます。詳細は、こちらを参照してください。
削除された機能
- インストール・ディレクトリを変更し、GraalVM言語ランタイムとその他のコンポーネントでGraalVMインストールを拡張するために使用されていたGraalVMアップデータ(
gu
)を削除しました。OpenJDKとの連携の一環として、JDKインストールを変更することは一般的ではありません。GraalVM言語ランタイムおよびその他のコンポーネントを引き続き使用するには、言語スタンドアロンを使用するか、プロジェクトでMavenまたはGradle依存関係として指定してください。詳細は、ポリグロット埋込みの更新内容、およびGitHubの問題#6855を参照してください。 - オプション
--language:<language>
(ビルド時に特定の言語ランタイムを有効にするためのもの)およびいくつかのマクロ・オプションを削除しました。詳細は、後続の説明を参照してください。
非推奨になった機能
- LLVMツールチェーン・コンポーネントは、Oracle GraalVM for JDK 23で削除するため非推奨になりました。
Javaおよびコンパイラ
- JavaベクトルAPI (JEP 338)操作の初期最適化を実装しました。ロード、保存、基本的な算術、減算、比較、およびブレンド操作は、可能な場合には、効率的な機械命令に変換されます。これはデフォルトで有効になっており、
-Dgraal.OptimizeVectorAPI=false
で無効にできます。この最適化は、GraalVMネイティブ・イメージではまだ使用できません。今後、さらに多くの操作とネイティブ・イメージのサポートが予定されています。この最適化は試験的なものです。 - GraalコンパイラのAMD64とAArch64の両方のアーキテクチャで、JDK 21より前のすべての組込み関数を実装しました。また、SHAメッセージ・ダイジェスト・スタブおよび
BigInteger
算術計算スタブの一部を含む、様々なHotSpotアセンブリ・スタブをJavaに移植しました。これにより、パフォーマンスに優れたこれらのアセンブリ・コードが、ネイティブ・イメージにとってのメリットとなります。 - ユーザーは、
-XX:UseBranchProtectionHotSpot
オプションを設定することで、Graalコンパイラで下位エッジCFIを有効にできます。ユーザーが標準的な保護またはPAC-RET保護を行う場合でも、AArch64アーキテクチャ上で実行する際には、Graalコンパイラで下位エッジCFIが自動的に有効になります。関数が返される前に、Graalコンパイラにより、署名された戻りアドレスの整合性をチェックする認証命令が発行されます。この整合性チェックが失敗した場合は、認証命令によって、ポインタ認証コード(PAC)用に予約されている破損したアドレスの上位ビットがスタンプされ、ポインタが無効化されます。関数が破損したポインタに戻ると、OSによってSIGSEGVシグナルが生成されますが、これは、破損したポインタが、現在では(マップされていないなど)無効なアドレスを参照しているためです。悪意のあるユーザーが格納された戻りアドレスを完全に制御している場合でも、そのユーザーが、プロセス・アドレス空間の上方にあるランダム・ポイントに指定するものをリセットすることで、認証命令によって制御が取り戻されます。UseBranchProtection
の詳細は、ここを参照してください。 - 次のJDK 21の機能は使用できません:
- JEP 439世代別ZGC
ネイティブ・イメージ
新機能
- ユーザーは、Linux AArch64アーキテクチャでG1ガベージ・コレクタを使用して、ヒープが大きく、一時停止時間が最小の効率的なネイティブ実行可能ファイルを構築できるようになりました(GraalVM Community Editionでは使用できません)。以前は、Linux AMD64でのみ使用可能でした。これを有効にするには、
native-image
ビルダーにオプション--gc=G1
を渡します。ネイティブ・イメージでのメモリー管理についてさらに説明します。 - 今後デフォルトになる新しいクラス初期化アプローチを導入しました。クラスの初期化構成に関係なく、すべてのクラスをビルド時に使用および初期化できるようになりました。実行時に初期化するよう構成されているクラスの場合は、実行時に再度、初期化されていないものとして表示されることを意味します。新しいアプローチを有効にするには、ネイティブ・イメージに
--strict-image-heap
フラグを渡します。詳細および実装の詳細は、提案#4684を参照してください。新しいポリシーを満たさないビルドが、次のエラーで失敗すると、既知の問題が発生することに注意してください:ブール・オプションの値に使用できるのは+または-のみです
。これは、2023年10月17日のパッチ・リリースで解決され、今後のブログ投稿で、新しいポリシーとベスト・プラクティスの詳細を共有する予定です。 - ビルド時に登録せずに
Proxy
クラスの作成を試行した場合に、VMError
ではなく、MissingReflectionRegistrationError
をスローすることで、不足しているメタデータのレポートを改善しました。 - 最高のピーク・パフォーマンスを実現するために、最適化レベル3を
native-image
ビルダーに追加しました(GraalVM Community Editionでは使用できません)。この新しいレベルには、これまで最適化レベル2の一部であった最適化と、プロファイルに基づく最適化との組合せで最大の効果をもたらす最適化があります。その結果、デフォルトの-O2
を使用して構築する場合のコンパイル時間が大幅に短縮されます。また、--pgo
オプションにより、-O3
が自動的に有効化されます。 - ネイティブ・イメージに外部ダウン・コール(OpenJDKプロジェクトPanama)の試験的なサポートを追加しました。お試しの上、フィードバックをお送りください。今後、アップコールのサポートが予定されています。
-
ネイティブ・イメージ・ビルド・プロセスで使用されるスレッド数を制御するオプション
--parallelism
を追加しました。最小数は2です。このオプションは、リソースが制約された環境の構築に便利です。また、このリリース以降、ビルド・プロセスのメモリーおよびスレッドの制限がビルド出力に表示されます。例:Build resources: - 13.24GB of memory (42.7% of 31.00GB system memory, determined at start) - 16 thread(s) (100.0% of 16 available processor(s), determined at start)
- ビルド出力に色を付けるオプション
--color[=WHEN]
を追加しました。WHEN
をalways
、never
またはauto
に置き換えてください。このAPIオプションは、試験的なオプション-H:+BuildOutputColorful
より優先されます。 - ネイティブ・イメージの試験的なオプション(ホストされているオプションの大部分で、
-H:
で始まる)へのアクセスを明示的にロック解除する新しいオプション-H:±UnlockExperimentalVMOptions
を導入しました。アクセスが明示的にリクエストされない場合、試験的なオプションの使用を試行すると、このリリースでは、アクション可能なエラー・メッセージが表示されてビルドが失敗します。また、どの依存関係により、これらのオプションがリクエストされたのかをユーザーが把握できるよう、アクティブな試験的オプションが、ビルド出力の中にオリジンとともにリストされます。次のリリースでは、この警告は、ビルド失敗になります。一方、コミュニティでは、特定の試験的なオプションをパブリックAPIに昇格させて、安定しているとマークした方がよい場合は、問題をオープンすることが推奨されています。詳細は、GitHubの問題#7105を参照してください。 - 次のJDK 21の機能は使用できません:
デバッグおよびモニタリングの改善
- モニタリングの使用感の向上: Javaフライト記録
ThreadCPULoad
イベントのサポートを追加しました。(BellSoftと共同。) -XX:+HeapDumpOnOutOfMemoryError
のサポートを追加しました。(Red Hatと共同。)
変更ログの更新内容の完全なリストを参照してください。
GraalVM SDKのリファクタ
GraalVM SDKは、4つの細かいモジュールに分割されています。graalvm-sdk
モジュールの使用は、非推奨になりました。このリリースでは、すべてのGraalVM APIに互換性があります。次の新しいモジュールを使用できます:
org.graalvm.nativeimage
: 高度なユース・ケース向けのネイティブ・イメージのパブリックAPI。org.graalvm.polyglot
: ポリグロット言語実装をJavaに埋め込むことができるライブラリ。org.graalvm.word
: Javaのマシンワードサイズの値の下位レベル・ライブラリ。org.graalvm.collections
: GraalVMコンポーネントのコレクション・ライブラリ。
Mavenおよびモジュールの依存関係を適宜更新します。これまでに、ネイティブ・イメージのGraalVM SDKを次のように使用していた場合:
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>23.1.0</version>
</dependency>
今後は次のようにします:
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>nativeimage</artifactId>
<version>23.1.0</version>
</dependency>
ポリグロット埋込み機能では、次を使用できるようになりました:
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>23.1.0</version>
</dependency>
詳細は、ポリグロット埋込みの更新内容を参照してください。
GraalVM SDKの変更ログに、更新内容の完全なリストがあります。
ポリグロット埋込み
- すべてのGraalVM言語アーティファクトを、ポリグロット埋込み機能の標準Maven依存関係に変換しました(#6852を参照)。以前は、埋込みでGraalVM言語を使用するには、GraalVMアップデータ・ツール(
gu install python
など)を使用してインストールする必要がありました。現在では、言語を有効にするには、言語アーティファクトがJavaモジュールまたはクラス・パスにあることが必要です。 graalvm-sdk
モジュールの使用は非推奨になりました。かわりに、org.graalvm.polyglot:polyglot
アーティファクトを使用してください。org.graalvm.polyglot
モジュールは、GraalVM JDKにデフォルトで含まれないようになりました。Javaでの言語の埋込みを有効にするには、言語を依存関係として指定します。ポリグロット・アプリケーション用にTruffleツールが必要な場合は、ツールも依存関係で有効にします。次に、Maven構成の例を示します:<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <!-- Select the language --> <artifactId>js|python|ruby|wasm|llvm|java</artifactId> <version>23.1.0</version> <type>pom</type> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>tools</artifactId> <version>23.1.0</version> <type>pom</type> </dependency>
これらの依存関係では、Oracle GraalVM上に構築された言語とツールが使用されます。GraalVM Community Editionバージョンを使用するには、
js-community
のように、artifactId
に接尾辞-community
を追加します。詳細は、更新された言語の埋込みに関するリファレンス・ドキュメントを参照してください。-
オプション
--language:<language>
(ビルド時に特定の言語ランタイムを有効にするためのもの)および次のマクロ・オプションを削除しました:--macro:polyglot-launcher --macro:polyglot-library --macro:truffle --macro:truffle-language-library
クラス/モジュールパスにこれらを配置すると、必要なことがすべて実行されるため、不要になりました。
その他の更新内容は、変更ログで確認できます。
JavaScriptおよびNode.js
- JavaScript (GraalJS)およびNode.jsランタイムをスタンドアロン・ディストリビューションとしてリリースしました。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、接尾辞
-community
が付いています(graaljs-community-<version>-<os>-<arch>.tar.gz
、graalnodejs-community-<version>-<os>-<arch>.tar.gz
)。JVMに付属するスタンドアロンの名前には、-jvm
接尾辞が付いています。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - JavaScriptを実行するための
ScriptEngine
実装は、GraalVMに同梱されなくなりました。ScriptEngine
モジュールに明示的に依存するように設定を移行し、モジュール・パスに追加します。詳細は、ScriptEngineのドキュメントを参照してください。 - JavaScriptランタイムを有効にするには、
gu install js
を使用してインストールするのではなく(GraalVMアップデータが削除されているため)、Maven依存関係として追加(次を参照)するか、JARをモジュール・パスに明示的に配置します。JavaにJavaScriptを埋め込むためのMaven依存関係も更新されました。JavaScript埋込みのMaven構成を次に示します。<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>js</artifactId> <version>23.1.0</version> <type>pom</type> </dependency>
これにより、Oracle GraalVMのJavaScriptランタイムが有効になります。かわりに、Communityライセンス・バージョンを使用するには、各アーティファクトに
-community
接尾辞を追加します(例:js-community
)。言語埋込みの依存関係設定を参照してください。 - ECMAScript 2023の機能をデフォルトで有効にしました。
- 新しい提案を実装しました:
- 非同期コンテキスト: 試験的なオプション
--js.async-context
の後ろで使用できます。 - String.dedent: ECMAScriptステージング・モードで、
--js.ecmascript-version=staging
オプションの後ろに使用できます。
- 非同期コンテキスト: 試験的なオプション
- Node.jsをバージョン18.17.1に更新しました。
その他の更新については、プロジェクトの変更ログを参照してください。
Java on Truffle
- Java on Truffle (Espresso)は、GraalVMに同梱されるのではなく、独立したスタンドアロン・ディストリビューションおよびMavenアーティファクトとして出荷されます。ネイティブ・ランチャを含むOracle GraalVMとGraalVM Community Editionの2つのスタンドアロン・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、
espresso-community-<version>-<os>-<arch>.tar.gz
のように、接尾辞-community
が付いています。Java on Truffleのスタート・ガイドを参照してください。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - Java on Truffleを有効にするには、
gu install espresso
を使用してインストールするのではなく(GraalVMアップデータが削除されているため)、Maven依存関係として追加(次を参照)するか、JARをモジュール・パスに明示的に配置します。<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>java</artifactId> <version>23.1.0</version> <scope>runtime</scope> <type>pom</type> </dependency>
これにより、Oracle GraalVMのJava on Truffleランタイムが有効になります。
- オプション
--enable-preview
を追加しました。
その他の更新については、プロジェクトの変更ログを参照してください。
LLVM
- GraalVM LLVMランタイムは、GraalVMに同梱されるのではなく、独立したスタンドアロン・ディストリビューションとして出荷されます。デフォルトで、LLVMツールチェーンが含まれています。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、
llvm-community-<version>-<os>-<arch>.tar.gz
のように、接尾辞-community
が付いています。JVMに付属するスタンドアロンの名前には、-jvm
接尾辞が付いています。LLVMのスタート・ガイドを参照してください。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - LLVMツールチェーンをバージョン16.0.1に更新しました。
flang
ツールチェーン・ラッパーを追加し、埋め込まれたビットコードによるFortranのコンパイルを可能にしました。
ノート: LLVMツールチェーンは、Oracle GraalVM for JDK 23で削除するため非推奨とマークされています。
Truffle言語およびツールの実装
- Truffle言語およびツールの実装は、Javaモジュールベースの分離により、埋込み機能から分離されています。これは、内部APIが誤って使用されないように、Javaモジュールに移行されたことを意味します。Truffle言語およびインストゥルメントに必要なモジュラ化の詳細は、このドキュメントを参照してください。
- 実行に必要なアプリケーション・モジュール・パスからリソースを簡単にアンパックおよび消費できるよう、Truffle言語およびインストゥルメント用の内部リソースAPIを実装しました。このAPIは、言語ホームの概念に替わるものです。追加のファイルを実行する必要がある言語またはインストゥルメントの場合は、次のステップを実行する必要があります:
- 必要なファイルをスタンドアロン・ディストリビューション(JAR)にバンドルします。
- リソース・ファイルを解凍できるよう、
InternalResource
インタフェースを実装します。 - 言語またはインストゥルメントにバンドルされたリソース・ファイルが必要な場合は、
Env#getInternalResource
メソッドをコールします。このメソッドにより、リクエストされたInternalResource
が解凍され、解凍されたファイルを含むディレクトリが作成されます。内部リソースの解凍は負荷の高い操作になる可能性があるため、実装により、内部リソースが確実にキャッシュされます。
- Truffle言語またはインストゥルメントは、GraalVM JDKで
-Dtruffle.class.path.append
を使用して提供されていたときとは異なり、アプリケーション・モジュール・パスからロードされるようになりました。Truffleクラス・パスは非推奨であるため、使用しないでください。言語は、名前付きモジュールとしての実行を求められるようになったため、言語を移行する必要があります。言語は引き続きクラス・パスからロードできますが、Truffleでは独自のクラス・ローダーおよびモジュール・レイヤーに内部的に言語がロードされるため、モジュールにする必要があります。 - Ideal Graph Visualizerのダンプが使いやすくなりました:
- IRダンプ: Truffleのフォルダにコンパイル層が追加され、コンパイルを区別しやすくなりました。ダンプ・レベルが2以上の場合は、インラインIRグラフが別々のフォルダに追加でダンプされるようになりました。
- ASTダンプ: Truffle ASTが、IRダンプ・フォルダの一部としてダンプされるようになりました。現在では、ダンプされたASTツリーに、インライン化されたすべてのASTが1つのツリーで表示されます。個々の関数は、IGV (上部ステータス・バー)の「クラスタ・ノード」関数を使用してグループ化できます。現在では、ルート・ノードに名前が表示されます。すべてのASTノードにプロパティ
graalIRNode
があり、対応するGraal IR定数(存在する場合)を検索できるようになっています。
Truffleの変更ログに、更新内容の完全なリストがあります。