Menu Close
第4章 OpenJDK の新機能
OpenJDK 17 には、Java アプリケーションの使用を強化する新機能が同梱されています。
OpenJDK 17 には、以下の新機能が含まれます。
コンテキスト固有のデシリアライズフィルター
OpenJDK 17 は、JVM 全体のフィルターファクトリーを使用して、コンテキスト固有で動的に選択されたデシリアライズフィルターを設定する Java プログラム機能を提供します。Java プログラムは、このフィルターをファクトリーで起動して、各デシリアライズ操作のフィルターを選択します。
コンテキスト固有のデシリアライズフィルターの詳細は、JEP 415: Context-Specific Deserialization Filters を参照してください。
Edwards-Curve デジタル署名アルゴリズム (EdDSA)
OpenJDK 17 は、EdDSA アルゴリズムを使用した暗号化署名の実装に対応しています。
EdDSA の詳細は、「JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)」を参照してください。
ファイルマッピングモード
OpenJDK 17 には、FileChannel
API への JDK 固有のファイルマッピングモードが含まれているため、NVM (Non-volatile Memory) にマッピングするMappedByteBuffer
インスタンスを作成できます。
JDK 固有のファイルマッピングモードの詳細は、JEP 352: Non-Volatile Mapped Byte Buffers を参照してください。
外部リンカー API (Incubator 機能)
OpenJDK 17 には、Foreign Linker API が導入されました。この API により、以下の機能を備えた Java プログラムが提供されます。
- 静的に型付けされた Java からネイティブコードへのアクセス。
- ネイティブライブラリーへのバインドが単純化されました。
Foreign Linker API の詳細は、JEP 389: Foreign Linker API を参照してください。
外部メモリーアクセス API (Incubator 機能)
OpenJDK 17 には、Java プログラムが、Java ヒープの外にある外部メモリーにアクセスするのに安全かつ効率的に使用できる Foreign-Memory Access API が導入されました。
Foreign-Memory Access API の詳細は、JEP 393: Foreign-Memory Access API を参照してください。
Foregin Function とメモリー API (Incubator 機能)
OpenJDK 17 には、Foreign Function と Memory API が導入されました。Java プログラムは、この API を使用して、Java ランタイム外のコードおよびデータと対話できます。
JVM の外部のコードなどの外部関数を効率的に呼び出し、JVM が管理しないメモリーなどの外部メモリーに安全にアクセスすることで、API は以下の機能を提供します。
- Java プログラムがネイティブライブラリーを呼び出せるようにします。
- 一般的な JNI (Java Native Interface) の問題が発生することなく、ネイティブデータを処理します。
Foregin Function およびメモリーAPI の詳細は、JEP 412: Foreign Function & Memory API を参照してください。
非表示のクラス
OpenJDK 17 は、非表示のクラスに対応しています。他のクラスのバイトコードでは、このような非表示のクラスを使用できません。
フレームワークは、ランタイム時にこのようなクラスを生成し、反射 と呼ばれるプロセスを介して間接的に使用できます。非表示のクラスは、アクセス制御ネストのメンバーとして定義できます。
非表示のクラスの詳細は、JEP 371: Hidden Classes を参照してください。
HotSpot クラスメタデータメモリー
OpenJDK 17 は、メタスペースなどの未使用の HotSpot クラスメタデータメモリーを、オペレーティングシステムに速やかに返します。これにより、オフヒープのメモリー使用率が低くなり、メタスペースコードの量が単純になります。
Hotspot クラスメタデータメモリーの詳細は、JEP 387: Elastic Metaspace を参照してください。
Java パッケージ
OpenJDK 17 には、新しいパッケージjava.lang.invoke.constant
が同梱されています。このパッケージには、クラスファイルの名義の説明や、定数プールから読み込むことができる定数などのランタイムアーティファクトをモデル化するのに使用できる API が含まれます。
java.lang.invoke.constant
の詳細は、「JEP 334: JVM Constants API」を参照してください。
JDK Flight Recorder (JFR) データ
OpenJDK 17 は、アプリケーションのパフォーマンスを継続的に監視するのに使用できるデータストリーム形式で、JFR データを提供します。
JFR データストリームの詳細は、JEP 349: JFR Event Streaming を参照してください。
jpackage
ツール
OpenJDK 17 には、自己完結型の Java アプリケーションのパッケージ化に使用できるjpackage
ツールが同梱されています。
jpackage
ツールの詳細は、JEP 392: Packaging Tool を参照してください。
instanceof
演算子のパターンマッチング
instanceof
演算子は、パターンマッチングに対応します。パターンマッチングは、プログラム内の共通論理に対応します。instanceof
演算子は、パターンマッチングを使用して、簡潔で安全な方法でオブジェクトからコンポーネントを条件付きで抽出できます。
パターンマッチングの詳細は、JEP 394: Pattern Matching for instanceof
を参照してください。
擬似乱数生ジェネレーター
OpenJDK 17 には、追加のインターフェースタイプと、疑似乱数ジェネレーター (PRNG) の実装が含まれます。Java プログラムは、このようなインターフェースタイプのいずれかを使用して、既存の PRNG での重複コードを減らしたり、その他のアプリケーションで PRNG アルゴリズムを再利用したりできます。このようなインターフェースの種類は、以下のとおりです。
-
SplittableRandomGenerator
-
JumpableRandomGenerator
-
LeapableRandomGenerator
-
ArbitrarilyJumpableRandomGenerator
新しいインターフェースタイプの詳細は、「JEP 356: Enhanced Pseudo-Random Number Generators」を参照してください。
レコードのクラス
レコードクラスを使用すると、Java コードを拡張できます。レコードクラスは、不変データの透過的なクラスとして機能するため、レコードクラスは、クラスを宣言するためのコンパクトな構文を提供します。
レコードクラスの詳細は、JEP 395: Records を参照してください。
シールされたクラス
シールドされたクラスとそのインターフェースを使用して、Java コードを拡張できます。シールされたクラスとそのインターフェースは、他のクラスやインターフェースがそれらを拡張または実装できるものを制限します。
シールされたクラスの詳細は、JEP 409: Sealed Classes を参照してください。
テキストブロック
OpenJDK 17 には、テキストブロックが含まれます。テキストブロックは、以下の機能を提供する複数行の文字列リテラルです。
- 文字列のフォーマットを自動的かつ予測可能に設定します。
- ユーザーに、文字列のフォーマットを指定するオプションを提供します。
- Java コードでエスケープシーケンスが必要なくなります。
テキストブロックの詳細は、「JEP 378: Text Blocks」を参照してください。
ベクトル API (Incubator 機能)
OpenJDK 17 では、インキュベーターモジュール jdk.incubator.vector
を最初に繰り返して、ランタイムに確実にコンパイルするベクトル計算を表現します。
ベクトル計算は、対応している CPU アーキテクチャーでベクトルハードウェア命令を最適化するため、スカラー計算を使用するアーキテクチャーと比較すると、このアーキテクチャーのパフォーマンスが向上します。
ベクトル API の詳細は、「JEP 414: Vector API」を参照してください。
Unix ドメインソケットチャネル
OpenJDK 17 では、java.nio.channels
パッケージのソケットチャネル API およびサーバーソケットチャネル API に、Unix ドメイン、AF_UNIX
、ソケットに対応しています。これにより、継承されたチャネルメカニズムが、Unix ドメインのソケットチャネルおよびサーバーソケットチャネルに対応するように拡張されました。
UNIX ドメインソケットチャネルの詳細は、「JEP 380: Unix-Domain Socket Channels」を参照してください。
Z ガーベジコレクター (ZGC)
OpenJDK 17 には、低レイテンシーのコレクターとして使用できる製品機能として ZGC が同梱されています。OpenJDK 17 の ZGC は、スレッドスタックの処理をセーフポイントから同時フェーズに移動します。これは、Shenandoah GC の場合と似ています。
また、OpenJDK 17 では、テクノロジープレビュー機能の ZGC に、以下の拡張機能が追加されました。
- ZGC を Windows オペレーティングシステムに接続します。JEP 365: Windows の ZGCを参照してください。
- ヒープメモリーから、アイドル状態のオペレーティングシステムに、コミットされていない未使用のメモリーを自動的に返します。JEP 351: ZGC: Uncommit Unused Memoryを参照してください。
テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。Red Hat では、実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、「テクノロジプレビュー機能のサポート範囲」を参照してください。
ZGC の詳細は、EP 377: ZGC: A Scalable Low-Latency Garbage Collector を参照してください。
同時スレッドスタック処理の詳細は、JEP 376: ZGC: Concurrent Thread-Stack Processing を参照してください。