第5章 OpenJDK の機能強化

OpenJDK 17 では、以前のリリースの OpenJDK で作成された機能に拡張が行われました。

CDS (Dynamic Class Data Sharing) アーカイブ

OpenJDK 17 は、Java プログラムの実行終了時にクラスの動的アーカイブを可能にするアプリケーションクラスデータ共有を拡張します。アーカイブされたクラスに、読み込み済みのアプリケーションクラスとライブラリークラスがすべて含まれるようになりました。このようなクラスは、デフォルトのベースレイヤーの CDS アーカイブでは利用できませんでした。

ダイナミック CDS アーカイブの詳細は、「JEP 350: Dynamic CDS Archives」を参照してください。

浮動小数点演算

OpenJDK 17 では、浮動小数点演算が strictfp セマンティックと厳密に一致するように設定されています。これは、従来の strictfp セマンティックのデフォルト設定と、微妙に異なるデフォルトの floating-point セマンティックからの変更です。

strictfp セマンティックは、Java SE 1.2 で厳格な浮動小数点モードおよびデフォルトの浮動小数点モード以前に導入されたセマンティックに一致する言語および仮想マシンに、元の浮動小数点セマンティックを復元します。

浮動小数点演算の詳細は、JEP 306: Restore Always-Strict Floating-Point Semantics を参照してください。

G1 ガーベジコレクター (GC)

OpenJDK 17 では、以下の機能で G1GC が強化されました。

  • これらのコレクションが設定した一時停止時間を超えた場合は、混合コレクションを中止します。
  • NUMA (Non-Uniform Memory Access) 対応のメモリー割り当てを実装します。
  • ヒープメモリーから、アイドル状態のオペレーティングシステムに、コミットされていない未使用のメモリーを自動的に返します。

混在したコレクションの中止の詳細は、「JEP 344: Abortable Mixed Collections for G1」を参照してください。

G1GC、JEP 345: NUMA-Aware Memory Allocation for G1 への NUMA 認識メモリー割り当ての詳細は、を参照してください。

G1GC からの未使用のコミット済メモリーの返却の詳細は、「JEP 346: Promptly Return Unused Committed Memory from G1」を参照してください。

レガシーDatagramSocket API

OpenJDK 17 では、java.net.DatagramSocket API および java.net.MulticastSocket API の基本的な実装が、新しい実装に置き換わりました。新しい実装には、以下の機能強化が含まれます。

  • 仮想スレッドとの互換性が向上しました。
  • メンテナンスとデバッグの提供が簡単になりました。
  • 実装が単純になりました。

Legacy DatagramSocket API の詳細は、JEP 373: Reimplement the Legacy DatagramSocket API を参照してください。

仮想スレッドの詳細は、「Loom - Fibers, Continuations and Tail-Calls for the JVM」を参照してください。

レガシーソケット API

OpenJDK 17 は、java.net.Socket API および java.net.ServerSocket API で使用される実装を、新しい実装に置き換えます。新しい実装には、以下の機能強化が含まれます。

  • ファイバーなどのユーザーモードのスレッドとの互換性が改善されました。
  • メンテナンスとデバッグの提供が簡単になりました。
  • 実装が単純になりました。

レガシーソケット API の再導入の詳細は、JEP 353: Reimplement the Legacy Socket API を参照してください。

ファイバーの詳細は、「Loom - Fibers, Continuations and Tail-Calls for the JVM」を参照してください。

Helpful NullPointerExceptions

OpenJDK 17 では、例外の発生時にnull 値がどこで発生したかを正確に記述することで、JVM (Java 仮想マシン) が生成したNullPointerException 例外の使用を改善しています。

NullPointerException例外の改善の詳細は、「JEP 358: Helpful NullPointerExceptions」を参照してください。

Shenandoah ガベージコレクター

OpenJDK 17 では、Shenandoah ガーベジコレクター (GC) が改善されました。Shenandoah が、Java スレッドと同時に実行することで、GC の一時停止時間を削減できるようになりました。

OpenJDK 17 では、Shenandoah GC でサブミリ秒の一時停止時間を実現できます。Shenandoah での一時停止時間は、Java ヒープサイズから独立しています。

Shenandoah GC の詳細は、JEP 379: Shenandoah: A Low-Pause-Time Garbage Collector を参照してください。

JDK インターナルを強力にカプセル化します。

OpenJDK 17 では、sun.misc.Unsafe などの重要な内部 API を除き、デフォルトで JDK の内部要素に対して強力なカプセル化メカニズムを提供しています。

以前のリリースの OpenJDK では、critical 要素や、non-critical 要素など、すべての内部 JDK 要素のカプセル化のレベルを下げることができました。OpenJDK 17 の内部要素では、このレベルのカプセル化を減らすことができません。

JDK の内蔵エレメントを強くカプセル化する方法は、JEP 403: Strongly Encapsulate JDK Internals を参照してください。

switch 表現

OpenJDK 17 は、switch ステートメントの機能を拡張し、ステートメント形式または式形式で使用できるようになりました。この機能により、コーディングが簡素化され、switch 式を使用したパターンマッチング機能が利用できるようになります。

どちらの形式も、traditionalsimplified のスコープ作成、および制御フロービヘイビアーに対応します。また、両方の形式で、従来の case… : ラベルまたは新しい case… → ラベルを使用できます。この場合、新しいステートメントでは、switch 式の値を指定します。

また、OpenJDK 17 は、switch へのパターンマッチングの拡張に対応しています。これにより、複数のパターンに対して、それぞれ特定の動作で式をテストして、複雑なデータ指向のクエリーを簡潔かつ安全に実行できるようになります。OpenJDK 17 の場合、この機能はテクノロジープレビューとしてのみ利用できます。

重要

OpenJDK 17 では、パターンマッチングを switch に拡張することがテクノロジープレビュー機能のみになります。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。Red Hat では、実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、「テクノロジプレビュー機能のサポート範囲」を参照してください。

switch 表現機能の詳細は、「JEP 361: Switch Expressions」を参照してください。

Java 関連のテクノロジープレビュー機能の詳細は、JEP 12: Preview Features を参照してください。