GraalVM Community Edition for JDK 23.0.1
(2024-10-15)
これは、GraalVM Community Edition for JDK 23用の2024年10月Oracleクリティカル・パッチ・アップデート(CPU)です。これはOpenJDK CPUに基づいており、そのCPUの一部としてリリースされたすべてのOpenJDKセキュリティ修正、プラットフォーム更新、およびいくつかのGraalVMバグ修正が含まれます。これは完全なディストリビューションであり、GraalVM Community Edition for JDK 23の以前のリリースに優先します。
- GraalVM Community Edition for JDK 23は23.0.1+11に更新されました。OpenJDK 23の更新を参照してください。
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン24.1.1は、GraalVM for JDK 23.0.1で使用するように設計されています。
- Graalコンパイラ:
UnimplementedGraalIntrinsics
をインスタンス化する場合、getHostBackend
を回避します。
- ネイティブ・イメージ:
- reachability-metadata.jsonでの
typeReachable
の生成を防止します。 Provider.Service.constructorCache
フィールドをリセットしました。- Windowsでの
--bundle-create
オプションおよびバンドル・ランチャ機能を修正しました。 - AArch64アーキテクチャで
crb
をリセットした後にsetConservativeLabelRange
を移動します。 - PGO構成が指定されている場合、
TruffleJfrFeature
を含めません。 ValueConversions
でキャッシュを積極的に初期化しました。- スイートから使用可能な場合にのみ、マニフェストにバージョン情報を追加しました。
- reachability-metadata.jsonでの
- Truffleフレームワーク:
- Truffleコンパイル・ログのAddr部分の配置を修正しました。
- JavaScript:
- オプション
js.webassembly
を安定させました。
- オプション
- GraalWasm:
- 定数メモリー・バッファの仮定を削除し、
ByteArrayWasmMemory
を簡素化しました。
- 定数メモリー・バッファの仮定を削除し、
- GraalPy:
- GraalPy Mavenプラグインと同様の機能を持つGraalPy Gradleプラグインを作成しました。
bouncycastle
依存関係を更新しました。VirtualFileSystem
で公開されていたTruffleファイルシステムSPIが非推奨になりました。
Oracle GraalVM for JDK 23
(2024-09-17)
- プラットフォームとディストリビューション
- JDK 23の機能の利用可能性
- Graalコンパイラ
- ネイティブ・イメージ
- ポリグロット・ランタイム
- ポリグロット埋込み
- Espresso
- GraalJS
- GraalPy
- GraalWasm
- Truffle言語およびツールの実装
- 非推奨になった機能および削除された機能
プラットフォームとディストリビューション
- Oracle JDK 23に基づいたOracle GraalVM for JDK 23がリリースされました。「Java SE 23リリース・ノート」を参照してください
- バージョン互換性:
- GraalVM for JDK 23は、Truffle言語およびその他のコンポーネントのバージョン24.1.0と互換性があります。
JDK 23の機能の利用可能性
- 455: パターン、instanceof、switchのプリミティブ型(プレビュー)
- 466: クラス・ファイルAPI (第2プレビュー)
- 467: Markdownドキュメント・コメント
- 471: 削除のためのsun.misc.Unsafeのメモリー・アクセス・メソッドの非推奨化
- 473: Stream Gatherers (第2プレビュー)
- 476: モジュール・インポート宣言(プレビュー)
- 477: 暗黙的に宣言されたクラスおよびインスタンスのmainメソッド(第3プレビュー)
- 480: 構造化同時実行性(第3プレビュー)
- 481: スコープ値(第3プレビュー)
- 482: 柔軟なコンストラクタ本体(第2プレビュー)
プレビュー機能を有効にするには、--enable-preview
を渡してそのいずれかを使用します。
Graalコンパイラ
- ディスプレイスメントが1バイトに収まる場合は、より小さいジャンプ命令を生成することで、x64アーキテクチャのコード・サイズを削減する新しいコンパイラ最適化が導入されました。この最適化は、デフォルトでネイティブ・イメージに対して有効化され、他の場所では無効化されます。有効にするには、
-Djdk.graal.OptimizeLongJumps=true
を使用します。 - GraalVM for JDK 24以降、
-Dgraal.
接頭辞で指定されたGraalオプションは非推奨になり、非推奨の警告が出力されます。GraalVM for JDK 23では、Graalオプションの両方のバリアント(-Dgraal.
および-Djdk.graal.
)がサポートされており、非推奨の警告はありません。
ネイティブ・イメージ
新機能
- 新しい最適化レベル
-Os
を追加して、最小のコード・サイズを実現し、結果としてファイル・サイズを縮小するようにオプティマイザを構成しました。これは、コードまたは実行可能ファイルのサイズを大幅に増加する可能性があるものを除き、-O2
の最適化を有効にします。詳細は、ネイティブ・イメージの最適化レベルに関する項を参照してください。 typeReachable
条件をtypeReached
に置き換えました。typeReached
条件により、メタデータ・エントリは、型に到達済とみなされると実行時に使用可能になります。実行時に型に到達すると、その直後にその型(クラスまたはインタフェース)のクラス初期化ルーチンが開始されるか、型のサブタイプのいずれかに到達します。- ネイティブ・イメージの到達可能性メタデータ構成を、単一のファイルreachability-metadata.jsonに簡素化しました。以前使用されていた個々のメタデータ・ファイル(reflection-config.json、resource-config.jsonなど)は、非推奨になりましたが、引き続き受け入れられます。詳細は、ドキュメントを参照してください。
- Java正規表現に加えて、リソースへのファイル・パスを指定するためのglobパターンのサポートを追加しました。トレース・エージェントは、glob形式のエントリを出力するようになりました。詳細は、ネイティブ・イメージでのリソースへのアクセスに関する項を参照してください。
proxy
タイプのエントリを追加して、リフレクションに対するjava.lang.reflect.Proxy
クラスの登録を有効化しました。これにより、実行時にProxy
クラスのメンバーにリフレクティブにアクセスできます。メタデータ・ファイルproxy-config.jsonは、非推奨になりましたが、下位互換性のために引き続き受け入れられます。トレース・エージェントは、新しいアプローチを使用するように変更されます。reachability-metadata.jsonでプロキシ・クラスを指定する新しい形式は次のとおりです:{ "reflection": [ { "type": { "proxy": [ "IA", "IB" ] } } ] }
- ネイティブ・イメージのプロキシ・タイプに安定した名前を追加しました。名前
$Proxy[id]
は、$Proxy.s[hashCode]
に置き換えられます。hashCode
は、プロキシ・インタフェースの名前、クラス・ローダーの名前、およびモジュールの名前(動的モジュールでない場合)を使用して計算されます。 - リフレクションおよびJNI構成ファイルに
type
フィールドを導入し、複雑な名前タイプをサポートするようにしました。 - 外部関数からのアップコールの試験的なサポートを追加することで、外部関数およびメモリーAPI (JEP 454)を改善しました("Project Panama"の一部)。現在、外部コールはx64アーキテクチャでサポートされています。
-H:+ForeignAPISupport
で有効にします。詳細は、「ネイティブ・イメージの外部関数およびメモリーAPI」を参照してください。 VarHandle
またはMethodHandle
を介してアクセスされるフィールドは、VarHandle
/MethodHandle
が完全に組込み可能である場合、「安全でないアクセス」としてマークされなくなりました。これにより、実行時のパフォーマンスが向上します。- ほぼ静的なネイティブ実行可能ファイルをビルドするための新しい
--static-nolibc
APIオプションを導入しました。これにより、試験段階の-H:±StaticExecutableWithDynamicLibC
オプションが置き換えられます。 - シリアルGCの古い世代のコンパクト・ガベージ・コレクション・モードを実装しました。これは
-H:+CompactingOldGen
オプションで有効にします。主な目的は、コピーするGCと比較してメモリー使用量を削減することです。詳細は、github.com/oracle/graal/pull/8870を参照してください。これは試験段階の機能です。 - 埋込みリソースに関する情報をembedded-resources.jsonに出力するオプション
-H:+GenerateEmbeddedResourcesFile
を追加しました。 - メモリーが残っていない場合に、ビルド時に
OutOfMemoryError
例外を捕捉するためのサポートを追加しました。 - ダイジェスト(シンボル名などに使用)を、16進文字列(40バイト)としてエンコードされたSHA-1から、Base-62文字列(22バイト)の128ビットMurmur3に変更しました。
非推奨になった機能
- GraalVM for JDK 22で非推奨になった古いクラス初期化戦略は、削除されました。オプション
--StrictImageHeap
の効果はなくなりました。 - 実行時のサポートされていない要素のレポートがデフォルトで有効になりました。オプション
--report-unsupported-elements-at-runtime
は非推奨です。
改善
- 明示的に設定された名前(
-o name
で指定)が-jar jarfile
オプションによって誤って上書きされないようにするためのチェックを追加しました。 --static
オプションの後に--libc=musl
が続かない場合に、ビルド・プロセスを終了し、適切なエラーをレポートするチェックを追加しました。静的リンクは現在、musl
でのみサポートされています。- 厳密なリフレクション構成モード(
ThrowMissingRegistrationErrors
が有効な場合)では、Unsafe.allocateInstance
は、構成に明示的に登録されたタイプに対してのみ許可されます。 - ネイティブ・イメージは、問合せが到達可能性メタデータに含まれていなかった場合に、JNI問合せの登録の欠落エラーをスローするようになりました。
デバッグおよびモニタリングの改善
- ビルド・レポートを生成するための新しいAPIオプション
--emit
を追加しました。これにより、試験段階のホスト・オプション-H:+BuildReport
が置き換えられます。古いオプション-H:BuildReportFile=custom-build-report.html
を使用するかわりに、--emit build-report=custom-build-report.html
を介してレポートを格納するパスを指定できます。(Oracle GraalVMでのみ使用できます。) - ネイティブ・メモリー・トラッキングの初期サポートを追加しました。
--enable-monitoring=nmt
で有効にします。(Red Hatと共同。) - イベント・スロットルおよび
ObjectAllocationSample
イベントのサポートを追加することで、JFRモニタリング・エクスペリエンスを改善しました。また、OldObjectSample
イベントの初期サポートも追加しました。(Red Hatと共同。) vswhere
を使用して、Visual Studio Codeのインストールを、より確実な方法により非標準のインストール場所で検索できるようになりました。- オプション
-XX:MissingRegistrationReportingMode
をビルド・オプションとしてではなく呼出し時に使用して、登録の欠落エラーのデバッグ時に再ビルドを回避できるようになりました。
ポリグロット・ランタイム
UNTRUSTED
ポリグロット・サンドボックス・ポリシーに対する実行時コンパイル済関数のエントリ・ポイントのランダム・オフセットを有効化しました。GraalVMはさらに、関数の開始オフセットをランダムな数のトラップ命令で埋めますが、これは潜在的なJITスプレー攻撃の防止に役立ちます。- 言語が他の言語スコープに直接アクセスして新しいポリグロット・ビルトインを実装できるように、
TruffleLanguage.Env.getScopePublic(LanguageInfo)
およびTruffleLanguage.Env.getScopeInternal(LanguageInfo)
を追加しました。 - 言語が実行場所を識別するために使用する内部バイトコード・インデックスにアクセスできるようにする
PolyglotException.StackFrame.getBytecodeIndex()
を追加しました。
ポリグロット埋込み
- HotSpotで実行されているJavaアプリケーションのリソース・キャッシュ・ディレクトリのデフォルトの場所を埋込み担当者がオーバーライドできるようにするシステム・プロパティ
polyglot.engine.userResourceCache
を追加しました。デフォルトでは、リソース・キャッシュ・ディレクトリは、ユーザーのホーム・ディレクトリのOS固有のキャッシュ・ディレクトリ内のorg.graalvm.polyglotディレクトリにあります。このオーバーライドの主な理由は、ユーザーのホーム・ディレクトリに書込みできない可能性があるコンテナで実行されているアプリケーションに対応することです。 - インタプリタでのゲスト・メソッドの実行中にスタック・オーバーフローから保護するためのオプション
engine.InterpreterCallStackHeadRoom
を追加しました。UNTRUSTED
ポリグロット・サンドボックス・ポリシーでは、オプションの値は必須オプションsandbox.MaxASTDepth
の値に基づいて自動的に計算され、オプションsandbox.MaxStackFrames
は必須ではなくなりました。新しいオプションは、AOTモードでのみ使用できます。 - HotSpotで仮想スレッドの試験的なサポートを追加しました。現在、すべての言語が仮想スレッドでの使用をサポートされるわけではありません。詳細は、言語の変更ログを確認してください。現在、Truffleデバッグ、CPU時間制限および一部のメモリー制限は仮想スレッドではサポートされていません。スレッド数は現在、コンテキストごとに入力される65535スレッドに制限されています。
RuntimeOptions.listDescriptors
およびgetDescriptor
メソッドは、RuntimeOptions.get
およびset
を介してすでにアクセス可能なGraalコンパイラ・オプション(存在する場合)も返します。- Javaホスト相互運用性では、ブリッジ・メソッドが公開されなくなりました。
変更ログに、更新内容の完全なリストがあります。
Espresso
- Espressoでは、TRegexを使用して
java.util.regex
パターンを実行できるようになりました。TRegexは、標準実装よりも優れたパフォーマンスを発揮します。このエンジンを有効にするには、java.UseTRegex
を使用します。 - 相互運用性の
ReadBuffer
メソッドをゲストの相互運用性APIから使用できるようになりました。ゲストのByteBuffer
オブジェクトがこの相互運用性メッセージを実装します。 - Java IDEでEspressoをデバッグする際のユーザー・エクスペリエンスを向上させるようにいくつかのJDWP互換性の問題を修正しました。
continuations
のサポートとともに、org.graalvm.continuations
パッケージを追加しました。詳細は、Espresso Continuationsのドキュメントを参照してください。- Espressoで使用されるJava標準ライブラリの検索に使用されるリソースをカスタマイズできるように、
java.RuntimeResourceId
を追加しました。espresso-runtime-
というリソースが使用されます。デフォルトでは、jdk21
、openjdk21
の順に試行されます。
GraalJS
- JavaScript WebAssembly APIは、GraalJSの安定した機能になり、Oracle GraalVMの一部としてサポートされるようになりました。
- ECMAScript 2024言語仕様はデフォルトで有効になっています。
- evalによって導入されたグローバル変数を再宣言可能にする提案を実装しました。
- Float16Arrayの提案を実装しました。ECMAScriptステージング・モード(
--js.ecmascript-version=staging
)で使用できます。 - Array.fromAsyncの提案を実装しました。ECMAScriptステージング・モード(
--js.ecmascript-version=staging
)で使用できます。 - サイズ変更および拡張が可能なArrayBufferの提案を実装しました。
- オプション
js.esm-eval-returns-exports
を安定させ、TRUSTED
サンドボックス・ポリシーで許可しました。
GraalPy
- GraalPyは、本番ワークロードに対する準備が完了し、完全にサポートされるようになりました。多くのネイティブ・ライブラリは動作しますが、ネイティブ拡張機能のサポートは試験段階のままです。
- Python 3.11.7に更新されました。
- 組込みの
_pickle
モジュール実装を、GraalVM Community Edition上でビルドされたGraalPyに追加しました。 - ポリグロットAPIの
eval
メソッドは、Pythonで他の言語からのコードを評価する際に、より意味のある例外をスローするようになりました。言語からの例外は、(polyglot.ForeignException
として型指定された)相互運用性オブジェクトとして直接起動します。言語を指定せずにPythonコードを実行するためのショートカットは削除されました。通常のeval
メソッドを使用してください。
GraalWasm
- GraalWasmは、本番ワークロードに対する準備が完了し、完全にサポートされるようになりました。
- SIMDの提案を実装しました。この機能はデフォルトで有効になっており、オプション
--wasm.SIMD=false
で無効にできます。 clock_res_get
、fd_advise
、fd_datasync
、fd_fdstat_set_rights
、fd_filestat_set_size
、fd_pread
、fd_pwrite
、fd_readdir
、fd_renumber
、fd_sync
およびfd_tell
関数のサポートを追加しました。
Truffle言語およびツールの実装
Node.getCost()
および関連するNodeCost
クラスは置換えなしで非推奨になりました。Truffle DSLは、このメソッドの実装を自動的に生成しなくなったため、デフォルトで常にNodeCost.MONOMORPHIC
を返します。これは、バイナリ・フットプリントを削減することを目的としています。- デバッグ・エクスペリエンスを改善しました:
DebuggerSession.suspend(Thread thread)
では、進行中のステップ実行戦略が保持されるようになりました。- デバッガのバックエンドまたは言語が一時停止の理由を問い合せることができるように、
SuspendedEvent.isStep()
、SuspendedEvent.isUnwind()
およびSuspendedEvent.isBreakpointHit()
を追加しました。
asinh
、acosh
、atanh
など、言語実装に役立つ追加の数学関数を提供するMathUtils APIを追加しました。UnadoptableNode
インタフェースを追加しました。結果が静的に判明している場合は、このインタフェースを優先してNode.isAdoptable()
をオーバーライドしてください。
Truffleの変更ログに、更新内容の完全なリストがあります。
非推奨になった機能および削除された機能
- Node.jsのサポートは、Oracle GraalVM for JDK 21で非推奨になり、Oracle GraalVM for JDK 23で削除されました。
- LLVMランタイムおよびLLVMツールチェーンのサポートは、Oracle GraalVM for JDK 21で非推奨になり、Oracle GraalVM for JDK 23で削除されました。