第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 を参照してください。