以前のバージョンから Red Hat build of OpenJDK 21 への移行


Red Hat build of OpenJDK 21

Red Hat Customer Content Services

概要

以前のバージョンから Red Hat build of OpenJDK 21 への移行』 ガイドでは、Red Hat build of OpenJDK バージョン 8、11、または 17 アプリケーションを Red Hat build of OpenJDK 21 にアップグレードする方法に関する情報が提供されています。

Red Hat build of OpenJDK ドキュメントへのフィードバック

エラーを報告したり、ドキュメントの改善を提案したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。

手順

  1. 次のリンクをクリックして チケットを作成します
  2. Summary に課題の簡単な説明を入力します。
  3. Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
  4. Create をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、用語の置き換えは、今後の複数のリリースにわたって段階的に実施されます。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。

第1章 Red Hat build of OpenJDK 21 への移行

以前のバージョンから Red Hat build of OpenJDK 21 への移行 ガイドでは、Red Hat build of OpenJDK バージョン 8、11、または 17 の Java アプリケーションを Red Hat build of OpenJDK 21 にアップグレードする方法に関する情報が提供されています。

このガイドでは、新機能や非推奨にされたり削除されたりした API など、Red Hat build of OpenJDK の以前のバージョンからの移行に影響を与える可能性のある Red Hat build of OpenJDK 21 リリースの変更を説明します。

Red Hat build of OpenJDK 11 以前から移行する場合について、本書では Red Hat build of OpenJDK 17 で導入された変更も説明します。Red Hat build of OpenJDK 11 以前のバージョンから移行する場合は、バージョン 11 と 17 の主な違い も理解しておく必要があります。

Red Hat build of OpenJDK 8 から移行する場合、このガイドでは Red Hat build of OpenJDK 11 で導入された変更も説明します。Red Hat build of OpenJDK 8 から移行する場合は、バージョン 8 と 11 の主な違い も理解しておく必要があります。

OpenJDK プロジェクトは、更新を提供し、下位互換性を提供するための保守的なアプローチで知られています。ただし、プロジェクトの進化、セキュリティー、安定性を保証するために、Red Hat build of OpenJDK プロジェクトには、Red Hat build of OpenJDK のメジャーリリース間でいくつかの非互換性が生じる場合があります。これらの非互換性は、次のシナリオに関連しています。

  • 廃止された、または安全でないと見なされる API を使用している場合。
  • 実装の詳細であり、公開またはサポートされている API の詳細ではないとみなされるプロジェクトの内部にアクセスする場合。
注記

Red Hat では、サポートされている最新の Red Hat build of OpenJDK ディストリビューションに移行することを推奨します。

1.1. Red Hat build of OpenJDK ディストリビューションについて

OpenJDK は、Java Platform、Standard Edition (Java SE) の無料のオープンソースリファレンス実装です。Red Hat build of OpenJDK ディストリビューションは、アップストリームの OpenJDK 8u、OpenJDK 11u、OpenJDK 17u、および OpenJDK 21u プロジェクトに基づいています。Shenandoah ガベージコレクターは、サポートされているすべての Red Hat build of OpenJDK バージョンに含まれています。

Red Hat build of OpenJDK のすべてのバージョンには、次の利点があります。

マルチプラットフォーム
Red Hat build of OpenJDK が RHEL および Microsoft Windows でサポートされているため、デスクトップ、データセンター、およびハイブリッドクラウド環境全体で単一の Java プラットフォーム上のアプリケーションを標準化できます。
頻繁なリリース
Red Hat は、Red Hat build of OpenJDK 8、Red Hat build of OpenJDK 11、Red Hat build of OpenJDK 17、および Red Hat build of OpenJDK 21 ディストリビューションに対して、JRE および JDK の更新を四半期ごとに提供します。これらの更新は、アーカイブ、RPM、および Windows MSI ベースのインストーラーファイルとコンテナーイメージとして利用できます。
長期サポート
Red Hat は、最近リリースされた Red Hat build of OpenJDK 8、Red Hat build of OpenJDK 11、Red Hat build of OpenJDK 17、および Red Hat build of OpenJDK 21 ディストリビューションをサポートします。

第2章 Red Hat build of OpenJDK 8 と Red Hat build of OpenJDK 11 の主な違い

Red Hat build of OpenJDK 8 から Java アプリケーションを移行する場合は、まず Red Hat build of OpenJDK 11 で導入された変更点をよく理解する必要があります。これらの変更により、Red Hat build of OpenJDK 21 に移行する前に、既存の Red Hat build of OpenJDK インストールを再設定する必要がある場合があります。

注記

この章では、現在 Red Hat build of OpenJDK 8 を使用している場合のみが対象です。すでに Red Hat build of OpenJDK 11 以降を使用している場合は、この章は無視できます。

Red Hat build of OpenJDK 8 とそれ以降のバージョンの主な違いの 1 つは、Red Hat build of OpenJDK 11 以降にモジュールシステムが含まれていることです。Red Hat build of OpenJDK 8 から移行する場合は、アプリケーションのライブラリーとモジュールを Red Hat build of OpenJDK 8 のクラスパスから Red Hat build of OpenJDK 11 以降のモジュールクラスに移動することを検討してください。この変更により、アプリケーションのクラスローディング機能を向上させることができます。

Red Hat build of OpenJDK 11 以降のバージョンには、メモリー使用量の向上、起動速度の向上、コンテナー統合の向上など、アプリケーションのパフォーマンスを向上させることができる新機能と機能拡張が含まれています。

注記

一部の機能は、Red Hat build of OpenJDK と、OpenJDK の他のアップストリームコミュニティーバージョンまたはサードパーティーバージョンとで異なる場合があります。以下に例を示します。

  • Shenandoah ガベージコレクターは、Red Hat build of OpenJDK のすべてのバージョンで使用できますが、この機能は OpenJDK の他のビルドではデフォルトで使用できない可能性があります。
  • OpenJDK 8 の JDK Flight Recorder (JFR) サポートはバージョン 8u262 以降で利用可能になり、バージョン 8u272 以降ではデフォルトで有効になっていますが、特定のビルドでは JFR が無効になっている可能性があります。JFR 機能は OpenJDK 11 の JFR のオープンソースバージョンからバックポートされたため、Red Hat build of OpenJDK 8 の JFR 実装は、Red Hat build of OpenJDK 11 以降の JFR とほぼ同じです。この JFR 実装は Oracle JDK 8 の JFR とは異なるため、Oracle JDK から Red Hat build of OpenJDK8 以降に移行場合は、JFR を使用するためのコマンドラインオプションに注意する必要があります。
  • OpenJDK の 32 ビットビルドは、通常、OpenJDK 8 以降でサポートされておらず、今後のバージョンで利用できない可能性があります。32 ビットビルドは、Red Hat build of OpenJDK のすべてのバージョンでサポートされません。

2.1. 暗号化とセキュリティー

Red Hat build of OpenJDK 8 と Red Hat build of OpenJDK 11 の間には、暗号化とセキュリティーに若干の違いがあります。ただし、Red Hat build of OpenJDK の両バージョンには、多くの類似した暗号化およびセキュリティー動作があります。

Red Hat build of OpenJDK はシステム全体の証明書を使用し、各ビルドはシステムのグローバル設定から無効な暗号化アルゴリズムのリストを取得します。これらの設定は、Red Hat build of OpenJDK のすべてのバージョンに共通であるため、Red Hat build of OpenJDK 8 から Red Hat build of OpenJDK 11 以降に簡単に変更できます。

FIPS モードでは、Red Hat build of OpenJDK 8 と Red Hat build of OpenJDK 11 のリリースは自己設定されるため、どちらのリリースでも起動時に同じセキュリティープロバイダーが使用されます。

Red Hat build of OpenJDK 8 と Red Hat build of OpenJDK 11 の TLS スタックは同じです。これは、Red Hat build of OpenJDK 11 の SunJSSE エンジンが Red Hat build of OpenJDK 8 にバックポートされたためです。Red Hat build of OpenJDK の両バージョンが、TLS 1.3 プロトコルをサポートしています。

Red Hat build of OpenJDK 8 と Red Hat build of OpenJDK 11 の間には、次のように、暗号化とセキュリティーに若干の違いがあります。

Expand
Red Hat build of OpenJDK 8Red Hat build of OpenJDK 11

TLS クライアントは、デフォルトではターゲットサーバーとの通信に TLSv1.3 を使用しません。この動作を変更するには、jdk.tls.client.protocols システムプロパティーを ‑Djdk.tls.client.protocols=TLSv1.3 に設定します。

TLS クライアントはデフォルトで TLSv.1.3 を使用します。

このリリースでは、Diffie-Hellman 鍵交換における X25519 および X448 楕円曲線の使用はサポートされていません。

このリリースでは、Diffie-Hellman 鍵交換における X25519 および X448 楕円曲線の使用がサポートされています。

このリリースでは、セキュリティー上の理由から無効になっている従来の KRB5 ベースの暗号スイートが引き続きサポートされます。jdk.tls.client.cipherSuites および jdk.tls.server.cipherSuites システムプロパティーを変更して、これらの暗号スイートを有効にすることができます。

このリリースでは、従来の KRB5 ベースの暗号スイートはサポートされていません。

このリリースでは、Datagram Transport Layer Security (DTLS) プロトコルはサポートされていません。

このリリースでは DTLS プロトコルはサポートされています。

DTLS で使用される max_fragment_length 拡張は、TLS クライアントでは使用できません。

max_fragment_length 拡張は、クライアントとサーバーの両方で利用できます。

2.2. ガベージコレクター

ガベージコレクションの場合、Red Hat build of OpenJDK 8 ではデフォルトで Parallel コレクターが使用されますが、Red Hat build of OpenJDK 11 ではデフォルトで Garbage-First (G1) コレクターが使用されます。

ガベージコレクターを選択する前に、次の詳細を考慮してください。

  • スループットを向上させる場合は、Parallel コレクターを使用します。Parallel コレクターはスループットを最大化しますが、レイテンシーは無視します。つまり、アプリケーションの応答時間を適正にする場合は、ガベージコレクションの一時停止が問題になる可能性があります。ただし、アプリケーションがバッチ処理を実行していて、一時停止時間を考慮する必要がない場合は、Parallel コレクターが最適な選択肢です。‑XX:+UseParallelGC JVM オプションを設定し、Parallel コレクターに切り替えることができます。
  • スループットとレイテンシーのバランスをとる場合は、G1 コレクターを使用します。G1 コレクターは、数百ミリ秒の一時停止時間で、妥当なレイテンシーを確保し、優れたスループットを実現できます。上記の説明のように、アプリケーションを Red Hat build of OpenJDK 8 から Red Hat build of OpenJDK 11 に移行するときにスループットの問題に気付いた場合は、Parallel コレクターに切り替えることができます。
  • ガベージコレクションを低レイテンシーに保つ場合は、Shenandoah コレクターを使用します。

起動時に ‑XX:+<gc_type> JVM オプションを指定することにより、使用するガベージコレクターのタイプを選択できます。たとえば、‑XX:+UseParallelGC オプションは Parallel コレクターに切り替えます。

2.3. ガベージコレクターのログオプション

Red Hat build of OpenJDK 11 には、古いロギングフレームワークよりも効率的に機能する、より強力な新しいロギングフレームワークが含まれています。Red Hat build of OpenJDK 11 には、統合された JVM ロギングオプションと統合された GC ロギングオプションも含まれています。

Red Hat build of OpenJDK 11 のロギングシステムは、デフォルトで - XX:+PrintGCTimeStamps および -XX:+PrintGCDateStamps オプションをアクティブにします。Red Hat build of OpenJDK 11 のロギング形式は Red Hat build of OpenJDK 8 とは異なるため、ガベージコレクターログを解析するコードを更新する必要がある場合があります。

Red Hat build of OpenJDK 11 で変更されたオプション

古いロギングフレームワークオプションは、Red Hat build of OpenJDK 11 で非推奨になりました。これらの古いオプションは、新しいロギングフレームワークオプションのエイリアスとしてのみ利用できます。Red Hat build of OpenJDK 11 以降をより効率的に使用する場合は、新しいロギングフレームワークオプションを使用してください。

次の表は、Red Hat build of OpenJDK バージョン 8 と 11 の間のガベージコレクターのログオプションの変更点を示しています。

Expand
Red Hat build of OpenJDK 8 のオプションRed Hat build of OpenJDK 11 のオプション

-verbose:gc

-Xlog:gc

-XX:+PrintGC

-Xlog:gc

-XX:+PrintGCDetails

-Xlog:gc*

あるいは、以下のような場合もあります。

-Xlog:gc+$tags

-Xloggc:$FILE

-Xlog:gc:file=$FILE

-XX:+PrintGCDetails オプションを使用する場合は、-Xlog:gc* フラグを渡します。アスタリスク (*) を指定することで、より詳細なロギングがアクティブになります。または、-Xlog:gc+$tags フラグを渡すこともできます。

-Xloggc オプションを使用する場合は、:file=$FILE 接尾辞を追加して、ログ出力を指定されたファイルにリダイレクトします。たとえば、-Xlog:gc:file=$FILE です。

Red Hat build of OpenJDK 11 で削除されたオプション

Red Hat build of OpenJDK 11 には、Red Hat build of OpenJDK 8 で非推奨となった次のオプションは含まれていません。

  • -Xincgc
  • -XX:+CMSIncrementalMode
  • -XX:+UseCMSCompactAtFullCollection
  • -XX:+CMSFullGCsBeforeCompaction
  • -XX:+UseCMSCollectionPassing

Red Hat build of OpenJDK 11 では、タイムスタンプと日付スタンプの出力が自動的に有効になるため、次のオプションも削除されます。

  • -XX:+PrintGCTimeStamps
  • -XX:+PrintGCDateStamps
注記

Red Hat build of OpenJDK 11 では、-XX:+IgnoreUnrecognizedVMOptions オプションを指定しない限り、前述の削除されたオプションのいずれかを使用すると起動に失敗します。

2.4. OpenJDK グラフィック

バージョン 8u252 以前の Red Hat build of OpenJDK 8 では、デフォルトのレンダリングエンジンとして Pisces を使用していました。バージョン 8u252 以降の Red Hat build of OpenJDK 8 では、新しいデフォルトのレンダリングエンジンとして Marlin が使用されます。Red Hat build of OpenJDK 11 以降のリリースでも、デフォルトで Marlin が使用されています。Marlin は、負荷の高いアプリケーショングラフィックスの処理を改善します。

レンダリングエンジンは同じ結果を生成するため、ユーザーにとっては、パフォーマンスの向上以外に特に違いはありません。

2.5. Webstart とアプレット

RHEL 7、RHEL 8、および Microsoft Windows オペレーティングシステム上の Red Hat build of OpenJDK 8 および Red Hat build of OpenJDK 11 で IcedTea-Web プラグインを使用することで、Java WebStart を使用できます。IcedTea-Web プラグインでは、システムに依存関係として Red Hat build of OpenJDK 8 がインストールされている必要があります。

アプレットは、Red Hat build of OpenJDK のどのバージョンでもサポートされていません。一部のアプレットは、Netscape プラグインアプリケーションプログラミングインターフェイス (NPAPI) ブラウザーで OpenJDK 8 と IcedTea-web プラグインを使用することで RHEL 7 上で実行できますが、Red Hat build of OpenJDK ではこの動作はサポートされていません。

注記

OpenJDK のアップストリームコミュニティーバージョンは、アプレットまたは Java Webstart をサポートしていません。これらのテクノロジーのサポートは非推奨であり、使用は推奨しません。

2.6. JPMS

OpenJDK 9 で導入された Java Platform Module System (JPMS) は、非公開 API へのアクセスを制限または防止します。JPMS は、Java アプリケーションの起動およびコンパイル方法 (クラスパスを使用するか、モジュールパスを使用するかなど) にも影響します。

内部モジュール

デフォルトでは、Red Hat build of OpenJDK 11 は JDK 内部モジュールへのアクセスに制限はありますが、アクセスできます。つまり、ほとんどのアプリケーションは変更なしに作業を継続できますが、これらのアプリケーションは警告を出力します。この制限を回避するには、java コマンドに ‑‑add-opens <module-name>/<package-in-module>=ALL-UNNAMED オプションを渡すことで、アプリケーションが内部パッケージにアクセスできるようにします。

以下に例を示します。

--add-opens java.base/jdk.internal.math=ALL-UNNAMED

さらに、--illegal-access=warn オプションを java コマンドに渡すことで、不正アクセスのケースを確認できます。このオプションは、Red Hat build of OpenJDK のデフォルトの動作を変更します。

ClassLoader

JPMS リファクターリングにより、Red Hat build of OpenJDK 11 の ClassLoader 階層が変更されます。

Red Hat build of OpenJDK 11 では、システムクラスローダーが URLClassLoader のインスタンスではなくなりました。Red Hat build of OpenJDK 11 で ClassLoader::getSystemClassLoader を呼び出してその結果を URLClassLoader にキャストする既存のアプリケーションコードでは、ランタイム例外が発生します。

Red Hat build of OpenJDK 8 では、クラスローダーを作成するときに、このクラスローダーインスタンスの親として null を渡すことができます。ただし、Red Hat build of OpenJDK 11 では、クラスローダーの親として null を渡すアプリケーションにより、クラスローダーがプラットフォームクラスを見つけられなくなる可能性があります。

Red Hat build of OpenJDK 11 には、特定のクラスのロードを制御できる新しいクラスローダーが含まれています。これにより、クラスローダーが必要なすべてのクラスを見つける方法が改善されます。Red Hat build of OpenJDK 11 では、クラスローダーインスタンスを作成するときに、ClassLoader.getPlatformClassLoader() API を使用してプラットフォームクラスローダーを親として設定できます。

2.7. 拡張機能および推奨オーバーライドメカニズム

Red Hat build of OpenJDK 11 では、オプションパッケージをサポートする拡張メカニズムと承認された標準オーバーライドメカニズムの両方が利用できなくなりました。

これらの変更により、<JAVA_HOME>/lib/ext または <JAVA_HOME>/lib/endorsed ディレクトリーに追加されたライブラリーは使用されなくなり、これらのディレクトリーが存在する場合、Red Hat build of OpenJDK 11 ではエラーが生成されます。

2.8. JFR 機能

JDK Flight Recorder (JFR) サポートは、バージョン 8u262 以降の Red Hat build of OpenJDK 8 にバックポートされました。JFR サポートは、Red Hat build of OpenJDK 8u272 以降デフォルトで有効になりました。

注記

バックポート という用語は、Red Hat がアップストリームソフトウェアの最新バージョンから更新を取得し、その更新を Red Hat が配布するソフトウェアの古いバージョンに適用することを指します。

バックポートされた JFR 機能

Red Hat build of OpenJDK 8 への JFR バックポートには、次のすべての機能が含まれていました。

  • Red Hat build of OpenJDK 11 でも利用できる多数のイベント
  • Red Hat build of OpenJDK 8 および 11 で一貫して動作する jfr や Java 診断コマンド (jcmd) などのコマンドラインツール
  • プログラムまたは jcmd で JMX Bean インターフェイスを使用して JFR を有効にするために使用できる Java Management Extensions (JMX) API
  • jdk.jfr 名前空間

    注記

    jdk.jfr 名前空間の JFR API は、Red Hat build of OpenJDK 8 では Java 仕様の一部とは見なされませんが、Red Hat build of OpenJDK 11 ではこれらの API は Java 仕様の一部です。JFR API はサポートされているすべての Red Hat build of OpenJDK バージョンで使用できるため、JFR を使用するアプリケーションでは、Red Hat build of OpenJDK 8 以降のバージョンで JFR API を使用するために特別な設定は必要ありません。

別途配布される JDK Mission Control も、Red Hat build of OpenJDK 8 と互換性を確保できるように更新されました。

他の OpenJDK バージョンとの互換性が必要なアプリケーション

アプリケーションが次のいずれかの OpenJDK バージョンと互換性を確保する必要がある場合は、これらのアプリケーションを適応させる必要がある場合があります。

  • 8u262 より前の OpenJDK バージョン
  • JFR をサポートしていない他のベンダーの OpenJDK バージョン
  • Oracle JDK

この取り組みを支援するために、Red Hat は、実行時に JFR が無効になっているかのように動作する、JFR の空の実装を提供する特別な互換性レイヤーを開発しました。JFR 互換性 API の詳細は、openjdk8-jfr-compat を参照してください。生成された .jar ファイルは、OpenJDK 8 ディストリビューションの jre/lib/ext ディレクトリーにインストールできます。

これらのアプリケーションが、MBean インターフェイスを照会するのではなく、バージョン番号のみをチェックして OpenJDK 8 を除外していた場合、一部のアプリケーションを更新する必要がある可能性があります。

2.9. JRE およびヘッドレスパッケージ

RHEL プラットフォーム用の Red Hat build of OpenJDK のすべてのバージョンは、以下のタイプのパッケージに分かれています。次のパッケージタイプのリストは、最も最小限のものから順にソートされています。

Java Runtime Environment (JRE) のヘッドレス
グラフィカルユーザーインターフェイスをサポートせずにライブラリーのみを提供しますが、イメージのオフラインレンダリングをサポートします。
JRE
フルグラフィカルクライアントの実行に必要なライブラリーを追加します
JDK
ツールおよびコンパイラーが含まれます

Windows プラットフォーム用の Red Hat build of OpenJDK バージョンは、ヘッドレスパッケージをサポートしていません。ただし、Windows プラットフォーム用の Red Hat build of OpenJDK パッケージも、RHEL プラットフォームのパッケージと同様に JRE および JDK コンポーネントに分割されています。

注記

OpenJDK 11 以降のアップストリームコミュニティーバージョンでは、パッケージはこのように分離されず、代わりに 1 つのモノリシック JDK インストールが提供されます。

OpenJDK 9 では、名前空間ごとに分割された JDK クラスライブラリーのモジュール化バージョンが導入されました。Red Hat build of OpenJDK 11 以降、これらのライブラリーは jmods モジュールにパッケージ化されています。詳細は、Jmods を参照してください。

2.10. Jmods

OpenJDK 9 では、JDK クラスライブラリーのモジュール化されたバージョンである jmods が導入され、各モジュールは関連するパッケージのセットからクラスをグループ化します。jlink ツールを使用して、選択したアプリケーションを実行するために必要なモジュールのサブセットのみを含む派生ランタイムを作成できます。

Red Hat build of OpenJDK 11 以降、RHEL プラットフォーム用の Red Hat build of OpenJDK では、jmods ファイルが、デフォルトでインストールされない別の RPM パッケージに配置されます。jlink を使用してアプリケーション用のスタンドアロン OpenJDK イメージを作成する場合は、jmods パッケージ (例: java-11-openjdk-jmods) を手動でインストールする必要があります。

注記

RHEL プラットフォームでは、OpenJDK はシステムライブラリーに対して動的にリンクされるため、結果として得られる jlink イメージは、RHEL の異なるバージョンや他のシステム間で移植できません。移植性を確保するには、Red Hat カスタマーポータルを通じてリリースされる Red Hat build of OpenJDK のポータブルビルドを使用する必要があります。詳細は、アーカイブを使用した RHEL への Red Hat build of OpenJDK のインストール を参照してください。

2.11. Red Hat build of OpenJDK 11 で非推奨および削除された機能

Red Hat build of OpenJDK 11 では、Red Hat build of OpenJDK 8 がサポートする一部の機能が非推奨または削除されています。

CORBA

Red Hat build of OpenJDK 11 は、以下の Common Object Request Broker Architecture (CORBA) ツールをサポートしません。

  • Idlj
  • orbd
  • servertool
  • tnamesrv
ロギングフレームワーク

Red Hat build of OpenJDK 11 は次の API をサポートしていません。

  • java.util.logging.LogManager.addPropertyChangeListener
  • java.util.logging.LogManager.removePropertyChangeListener
  • java.util.jar.Pack200.Packer.addPropertyChangeListener
  • java.util.jar.Pack200.Packer.removePropertyChangeListener
  • java.util.jar.Pack200.Unpacker.addPropertyChangeListener
  • java.util.jar.Pack200.Unpacker.removePropertyChangeListener
Java EE モジュール

Red Hat build of OpenJDK 11 は次の API をサポートしていません。

  • java.activation
  • java.corba
  • java.se.ee (aggregator)
  • java.transaction
  • java.xml.bind
  • java.xml.ws
  • java.xml.ws.annotation
java.awt.peer

Red Hat build of OpenJDK 11 では、java.awt.peer パッケージが内部として設定されるため、アプリケーションはデフォルトではこのパッケージに自動的にアクセスできません。この変更により、Red Hat build of OpenJDK 11 は、Component.getPeer メソッドなどのピア API を参照するクラスとメソッドを多数削除しました。

以下のリストは、ピア API の最も一般的なユースケースの概要を示しています。

  • 新しいグラフィックポートを作成する
  • コンポーネントを表示できるかどうかを確認する
  • コンポーネントが軽量であるか、Xlib XWindow などのオペレーティングシステムのネイティブ UI コンポーネントリソースによってサポートされているかを確認する

Java 1.1 以降では、Component.isDisplayable() メソッドは、コンポーネントを表示できるかどうかを確認する機能を提供します。Java 1.2 以降では、Component.isLightweight() メソッドは、コンポーネントが軽量かどうかを確認する機能を提供します。

javax.security と java.lang API

Red Hat build of OpenJDK 11 は次の API をサポートしていません。

  • javax.security.auth.Policy
  • java.lang.Runtime.runFinalizersOnExit(boolean)
  • java.lang.SecurityManager.checkAwtEventQueueAccess()
  • java.lang.SecurityManager.checkMemberAccess(java.lang.Class,int)
  • java.lang.SecurityManager.checkSystemClipboardAccess()
  • java.lang.SecurityManager.checkTopLevelWindow(java.lang.Object)
  • java.lang.System.runFinalizersOnExit(boolean)
  • java.lang.Thread.destroy()
  • java.lang.Thread.stop(java.lang.Throwable)
Sun.misc

sun.misc パッケージ は、常に内部用であり、サポートされていないものとみなされてきました。Red Hat build of OpenJDK 11 では、次のパッケージが非推奨化または削除されました。

  • sun.misc.BASE64Encoder
  • sun.misc.BASE64Decoder
  • sun.misc.Unsafe
  • sun.reflect.Reflection

以下の情報を考慮してください。

  • Red Hat build of OpenJDK 8 では、sun.misc.BASE64Encoder および sun.misc.BASE64Decoder API の代わりに java.util.Base64 パッケージが追加されました。これらの API は Red Hat build of OpenJDK 11 から削除されているため、代わりに java.util.Base64 パッケージを使用できます。
  • Red Hat build of OpenJDK 11 では sun.misc.Unsafe パッケージが非推奨となり、削除される予定です。sun.misc.Unsafe の代わりとして使用できる新しい API セットの詳細は、JEP 193 を参照してください。
  • Red Hat build of OpenJDK 11 では、sun.reflect.Reflection パッケージが削除されます。sun.reflect.Reflection.getCallerClass メソッドに代わるスタックウォーキングの新機能の詳細は、JEP 259 を参照してください。

第3章 Red Hat build of OpenJDK 11 と Red Hat build of OpenJDK 17 の主な違い

Red Hat build of OpenJDK 11 以前のバージョンから Java アプリケーションを移行する場合は、まず Red Hat build of OpenJDK 17 で導入された変更点をよく理解する必要があります。これらの変更により、Red Hat build of OpenJDK 21 に移行する前に、既存の Red Hat build of OpenJDK インストールを再設定する必要がある場合があります。

注記

この章では、現在 Red Hat build of OpenJDK 11 以前のバージョンを使用している場合のみが対象です。すでに Red Hat build of OpenJDK 17 を使用している場合は、この章は無視できます。

3.1. Concurrent Mark Sweep ガベージコレクターの削除

Red Hat build of OpenJDK 17 には、Concurrent Mark Sweep (CMS) ガベージコレクターが含まれなくなりました。これは、一時停止時間と遅延に敏感なワークロードに対して以前のリリースで一般的に使用されていました。

CMS コレクターを使用している場合は、Red Hat build of OpenJDK 17 以降に移行する前に、ワークロードに基づいて以下のいずれかのコレクターに切り替えます。

  • Garbage-First (G1) コレクターは、パフォーマンスとレイテンシーのバランスを取ります。G1 は、通常数百ミリ秒の一時停止時間で、高い一時オブジェクトの割り当て率を実現する世代別コレクターです。G1 はデフォルトで有効になっていますが、-XX:+UseG1GC JVM オプションを設定し、このコレクターを手動で有効にすることができます。
  • Shenandoah コレクターは、通常の一時停止時間が数ミリ秒である、低レイテンシーコレクターです。Shenandoah は世代別コレクターではないため、G1 コレクターよりも一時オブジェクトの割り当て率が低くなる可能性があります。Shenandoah コレクターを有効にする場合は、-XX:+UseShenandoahGC JVM オプションを設定します。
  • Z ガベージコレクター (ZGC) は、もう 1 つの低レイテンシーコレクターです。Shenandoah コレクターとは異なり、ZGC は圧縮された通常のオブジェクトポインター (OOP) (つまり、ヒープ参照) をサポートしません。圧縮された OOP はヒープメモリーを節約し、最大 32 GB のヒープサイズのパフォーマンスを向上させるのに役立ちます。これは、特にヒープサイズが小さい場合に、ZGC の常駐メモリーサイズが Shenandoah コレクターよりも大きくなる可能性があることを意味します。ZGC コレクターを有効にする場合は、-XX:+UseZGC JVM オプションを設定します。

詳細は、JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector を参照してください。

3.2. pack200 ツールおよび API の削除

Red Hat build of OpenJDK 17 には、以下の機能が含まれなくなりました。

  • pack200 ツール
  • unpack200 ツール
  • java.util.jar.Pack200 API
  • java.util.jar.Pack200.Packer API
  • java.util.jar.Pack200.Unpacker API

OpenJDK 9 で JMOD モジュール形式が導入されて以来、これらのツールと API の使用は制限されています。

詳細は JEP 367: Remove the Pack200 Tools and API を参照してください。

3.3. Nashorn JavaScript エンジンの削除

Red Hat build of OpenJDK 17 には、以下の機能が含まれなくなりました。

  • Nashorn JavaScript エンジン
  • jjs コマンドラインツール
  • jdk.scripting.nashorn モジュール
  • jdk.scripting.nashorn.shell モジュール

スクリプト API javax.script は、Red Hat build of OpenJDK 17 以降でも引き続き使用できます。OpenJDK 8 より前のリリースと同様に、Rhino や現在は外部で管理されている Nashorn JavaScript エンジンなど、任意の JavaScript エンジンで javax.script API を使用できます。

詳細は、JEP 372: Remove the Nashorn JavaScript Engine を参照してください。

3.4. JDK 内部要素の強力なカプセル化

Red Hat build of OpenJDK 17 では、sun.misc.Unsafe などの重要な内部 API を除いて、JDK のすべての内部要素の強力なカプセル化が導入されています。Red Hat build of OpenJDK 17 以降では、コマンドラインオプション 1 つを使用して内部要素の強力なカプセル化を軽減できません。つまり、Red Hat build of OpenJDK 17 以降のバージョンでは、重要な内部 API 以外の JDK 内部型へのリフレクションアクセスができません。

詳細は、JEP 403: Strongly Encapsulate JDK Internals を参照してください。

3.5. デフォルトでのバイアスロックの無効化

Red Hat build of OpenJDK 17 では、バイアスロックがデフォルトで無効になっています。Red Hat build of OpenJDK 17 では、起動時に -XX:+UseBiasedLocking JVM オプションを設定して、バイアスロックを有効にすることができます。ただし、-XX:+UseBiasedLocking オプションは Red Hat build of OpenJDK 17 では非推奨となっており、OpenJDK 18 では削除される予定です。

詳細は、JEP 374: Deprecate and Disable Biased Locking を参照してください。

3.6. RMI アクティベーションの削除

Red Hat build of OpenJDK 17 では、Java リモートメソッド呼び出し (RMI) 用の java.rmi.activation パッケージとそれに関連する rmid アクティベーションデーモンが削除されます。その他の RMI 機能は、Red Hat build of OpenJDK 17 以降のバージョンでも引き続き利用できます。

詳細は、JEP 407: Remove RMI Activation を参照してください。

3.7. Graal コンパイラーの削除

Red Hat build of OpenJDK 17 では、jaotc ツールと jdk.internal.vm.compiler および jdk.internal.vm.compiler.management モジュールで構成される Graal コンパイラーが削除されます。Red Hat build of OpenJDK 17 以降では、事前 (AOT) コンパイルを使用する場合は GraalVM を使用できます。

詳細は、JEP 410: Remove the Experimental AOT and JIT Compiler を参照してください。

第4章 Red Hat build of OpenJDK 17 と Red Hat build of OpenJDK 21 の主な違い

Java アプリケーションを Red Hat build of OpenJDK 17 以前から Red Hat build of OpenJDK 21 に移行する前に、バージョン 21 の変更点をよく理解しておく必要があります。これらの変更により、バージョン 21 に移行する前に、既存の Red Hat build of OpenJDK インストールを再設定する必要がある場合があります。

ソースコードのほとんどは、Red Hat build of OpenJDK 21 ですでに機能するはずです。ただし、Red Hat build of OpenJDK 21 には、ソースコードをより堅牢かつ安全にするのに役立つ追加機能がいくつか含まれています。このようなの新機能を理解し、この追加機能を使用するためにアプリケーションをアップグレードすることを推奨します。

Common Locale Data Repository (CLDR) のバージョン変更により、OpenJDK 20 以降のバージョンでは、OpenJDK 19 以前で作成された一部の日付と時刻の文字列を解析できません。以降の JDK バージョンでは、これらの問題の一部を修正できる ”loose match” メカニズムがサポートされています。ただし、日付と時刻の文字列の解析で問題が発生した場合は、アプリケーションの起動時に -Djava.locale.providers=COMPAT パラメーターを使用し、これらの文字列を新しい CLDR バージョンに移行することを検討してください。

注記

Red Hat は、32 ビットをサポートする builds of OpenJDK を提供していません。OpenJDK 21 では、Windows 32 ビット x86 サポートもアップストリームで非推奨となりました。この機能は今後のリリースで削除されます。詳細は、JEP 449: Deprecate the Windows 32-bit x86 Port for Removal を参照してください。

4.1. デフォルトで使用される UTF-8 文字セット

Red Hat build of OpenJDK 21 以降では、ファイルの読み取りと書き込み、およびテキストの処理に API を使用する場合、UTF-8 がデフォルトの文字セットになります。以前のリリースでは、引数として文字セットが渡されなかった場合、文字セットはランタイム環境に基づいており、呼び出される特定のメソッドに依存していました。アプリケーションで使用される文字エンコードの想定が異なるものとならないように、アプリケーションのソースコードと環境を確認してください。

詳細は、JEP 400: UTF-8 by Default を参照してください。

4.2. Z ガベージコレクターの改善

Red Hat build of OpenJDK 21 では、Z ガベージコレクター (ZGC) が拡張され、新しいオブジェクトと古いオブジェクトの割り当てリージョン (つまり、世代) が別々に維持されます。この機能強化により、ZGC は新しいオブジェクトをより頻繁に収集できるようになり、アプリケーションのパフォーマンスが向上します。

起動時に -XX:+UseZGC および -XX:+ZGenerational JVM オプションを指定し、世代別 ZGC を有効にすることができます。

詳細は、JEP 439: Generational ZGC を参照してください。

4.3. エージェントの動的ロードに関する警告

Red Hat build of OpenJDK 21 では、実行中の JVM にエージェントが動的にロードされると警告が発行されます。エージェントの動的ロードは、今後のリリースではデフォルトで許可されない予定です。アプリケーションが現在、JVM へのエージェントの動的ロードに依存している場合は、別のアプローチを使用するようにアプリケーションコードを更新することを検討してください。

詳細は、JEP 451: Prepare to Disallow the Dynamic Loading of Agents を参照してください。

4.4. ファイナライズの非推奨化および削除

Red Hat build of OpenJDK 21 では、オブジェクトの破棄前のクリーンアップ操作に使用されるファイナライズ機能が非推奨になりました。ファイナライズ機能は今後のリリースで削除される予定です。

Red Hat build of OpenJDK 21 では、引き続きデフォルトでファイナライズが有効になっています。早期のテストを容易にするために、--finalization=disabled コマンドラインオプションを設定してファイナライズを無効化できます。

ファイナライズに依存するライブラリーやアプリケーションを保守している場合は、cleanerstry -with-resources ステートメントなどの他のリソース管理手法への移行を検討してください。この変更により、ライブラリーとアプリケーションのメンテナーはできるだけ早くコードをテストすることを推奨します。

詳細は、JEP 421: Deprecate Finalization for Removal を参照してください。

4.5. インターネットアドレス解決 SPI

Red Hat build of OpenJDK 21 には、さまざまなリゾルバープロバイダーの使用をサポートするホスト名とアドレス解決用のサービスプロバイダーインターフェイス (SPI) が含まれています。Red Hat build of OpenJDK 21 では、InetAddress API はサービスローダーを使用してリゾルバープロバイダーを検索します。以前のリリースと同様に、プロバイダーが見つからない場合、JDK は組み込み実装を使用します。

詳細は、JEP 418: Internet-Address Resolution SPI を参照してください。

4.6. シンプルな Web サーバー

Red Hat build of OpenJDK 21 には、シンプルな Web サーバーを起動するために使用できる jwebserver コマンドラインツールが含まれています。この機能の目的は、特に教育目的でのプロトタイピング、アドホックコーディング、テストをサポートすることです。

jwebserver ツールは HTTP 1.1 プロトコルをサポートし、静的ファイルのみを提供します。シンプルな Web サーバーは安全な HTTPS プロトコルをサポートしていないため、実稼働サービスには適していません。

シンプルな Web サーバーを実行するには、次のコマンドを使用できます。

$ jwebserver

デフォルトでは、ファイルは現在のディレクトリーから提供されます。要求されたリソースがインデックスファイルを含むディレクトリーである場合、インデックスファイルが提供されます。

この機能には、jwebserver ツールに加えて、HTTP ヘッダーを返すために使用できる拡張リクエスト処理をサポートする API も含まれています。

以下に例を示します。

jshell> var h = HttpHandlers.handleOrElse(r -> r.getRequestMethod().equals("PUT"),
   ...> new SomePutHandler(), new SomeHandler());
jshell> var f = Filter.adaptRequest("Add Foo header", r -> r.with("Foo", List.of("Bar")));
jshell> var s = HttpServer.create(new InetSocketAddress(8080),
   ...> 10, "/", h, f);
jshell> s.start();

詳細は、JEP 408: Simple Web Server を参照してください。

4.7. 順序付けられたコレクション

Red Hat build of OpenJDK 21 では、順序付けられたコレクションを表すための新しいインターフェイスを追加するシーケンスコレクション機能が導入されています。各コレクションには、検出順序が明確に定義されたさまざまな要素があります。この機能は、順序付けられた各コレクションが最初の要素、最後の要素、およびその他の特定の要素にアクセスする方法を統一します。

SequencedCollection インターフェイス

SequencedCollection インターフェイスは、コレクション内の最初の要素と最後の要素を追加、取得、または削除するためのメソッドと、コレクションの逆順のビューを取得するためのメソッドを提供します。

interface SequencedCollection<E> extends Collection<E> {
    // new method
    SequencedCollection<E> reversed();
    // methods promoted from Deque
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}

SequencedCollection インターフェイスは、SortedSetNavigableSetLInkedHashSetList、および Deque インターフェイスで実装されます。

SequencedMap インターフェイス

SequencedMap インターフェイスは、コレクションの両端のエントリーを取得または削除するためのメソッドを提供します。

interface SequencedMap<K,V> extends Map<K,V> {
    // new methods
    SequencedMap<K,V> reversed();
    SequencedSet<K> sequencedKeySet();
    SequencedCollection<V> sequencedValues();
    SequencedSet<Entry<K,V>> sequencedEntrySet();
    V putFirst(K, V);
    V putLast(K, V);
    // methods promoted from NavigableMap
    Entry<K, V> firstEntry();
    Entry<K, V> lastEntry();
    Entry<K, V> pollFirstEntry();
    Entry<K, V> pollLastEntry();
}

SequencedMap インターフェイスは、SortedMapNavigableMap、および LInkedHashMap インターフェイスによって実装されます。

詳細は、JEP 431: Sequenced Collections を参照してください。

4.8. switch ステートメントのパターンマッチング

Red Hat build of OpenJDK 21 では、switch ステートメントのパターンマッチングによって Java プログラミング言語が強化されています。この機能拡張により、それぞれ特定のアクションを持つさまざまなパターンに対して switch 式をテストし、複雑なデータ指向クエリーを簡潔かつ安全に表現できるようになります。

オブジェクトのクラスに基づく switch ステートメントを実装できます。

以下に例を示します。

switch (obj) {
		case Integer i -> String.format("int %d", i);
		case String s  -> String.format("String %s", s);
		default        -> obj.toString();
	};

switch ステートメントの case ブロック内に when ガードを入れ子にし、より複雑な switch ステートメントを実装することもできます。

以下に例を示します。

switch (response) {
    	case null -> { }
    	case String s when s.equalsIgnoreCase("YES") -> {
        	System.out.println("You got it");
    	}
    	case String s when s.equalsIgnoreCase("NO") -> {
        	System.out.println("Shame");
    	}
    	case "n", "N" -> {
        	System.out.println("Shame");
    	}
    	case String s -> {
        	System.out.println("Sorry?");
    	}
}

アプリケーションで switch ステートメントを使用する場合は、これらのステートメントが最新であることを確認してください。

詳細は、JEP 441: Pattern Matching for switch を参照してください。

4.9. キーのカプセル化メカニズム API

Red Hat build of OpenJDK 21 では、鍵カプセル化メカニズム (KEM) 用の API が導入されています。KEM は、公開鍵暗号を使用して対称鍵を保護するための暗号化手法です。KEM API は公開鍵暗号化の使用を容易にし、秘密やメッセージを処理する際のセキュリティーの向上に役立ちます。

詳細は、JEP 452: Key Encapsulation Mechanism API を参照してください。

4.10. Java API ドキュメントのコードスニペット

Red Hat build of OpenJDK 21 には、Javadoc ツールの標準ドックレット用の @snippet タグが含まれています。@snippet タグは、API ドキュメントへのソースコードのサンプルの追加を簡素化するのに役立ちます。

以下に例を示します。

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 * 	System.out.println("v: " + v.get()); // @highlight substring="println"
 * }
 * }
 */

マークアップタグ

@snippet タグを @highlight などのマークアップタグと組み合わせて使用して、コードのスタイルを変更できます。たとえば、次のコードスニペットでは、@highlight タグを使用して、API ドキュメント内の println メソッド名を強調表示します。

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 * 	System.out.println("v: " + v.get()); // @highlight substring="println"
 * }
 * }
 */

外部ファイル

@snippet タグを、ソースコードを含む外部ファイルと組み合わせて使用することもできます。

以下に例を示します。

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet file="ShowOptional.java" region="example"}
 */

上記の例では、ShowOptional.java は次のコードを含むファイルです。

public class ShowOptional {
	void show(Optional<String> v) {
    	// @start region="example"
    	if (v.isPresent()) {
        	System.out.println("v: " + v.get());
    	}
    	// @end
	}
}

外部コードの場所は、class 属性を使用してクラス名として指定することも、file 属性を使用して相対ファイルパスとして指定することもできます。

詳細は、JEP 413: Code Snippets in Java API Documentation を参照してください。

4.11. 仮想スレッド

Red Hat build of OpenJDK 21 では、仮想スレッドが導入されています。これは、高スループットの同時実行アプリケーションの作成、保守、監視の労力を軽減する軽量スレッドです。アプリケーションが数千を超える同時スレッドを使用し、ワークロードが CPU に依存していない場合は、仮想スレッドを使用するとアプリケーションを最適化できます。

仮想スレッドはスレッドローカル変数と割り込みをサポートします。仮想スレッドは、従来のスレッドが実行できる任意のコードも実行できます。したがって、スレッドの作成方法を変更することで、仮想スレッドのみを使用するようにソースコードを移行できます。

次の例では、実行可能なインスタンスを実行する仮想スレッドを作成します。

Thread thread = Thread.ofVirtual().name("example").unstarted(runnable);

次の例は、ループを使用して仮想スレッドを作成する方法を示しています。仮想スレッドはプールを必要としないため、スレッドプールは作成されません。同時実行性を制限する場合は、代わりにセマフォを使用できます。

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
	IntStream.range(0, 10000).forEach(i -> {
    	  executor.submit(() -> {
        	  Thread.sleep(Duration.ofSeconds(1));
        	  return i;
    	});
    });
}  // executor.close() is called implicitly, and waits

上記の例では、同時に実行される 10,000 個の仮想スレッドが作成されます。JDK は、少数のオペレーティングシステムスレッド、または 1 つのスレッドのみでコードを実行できるため、オーバーヘッドが削減されます。

詳細は、JEP 444: Virtual Threads を参照してください。

4.12. Vector API

OpenJDK 16 では当初、Vector API がインキュベーション機能として導入されました。Red Hat build of OpenJDK 21 には、6 回目のインキュベーションに基づいて Vector API に機能拡張が複数含まれています。Vector API は、サポートされている CPU アーキテクチャー上で最適なベクトル命令に実行時に確実にコンパイルできる、幅広いベクトル計算を表現します。この API は、同等のスカラー計算よりも優れたパフォーマンスレベルを実現します。

最新の機能拡張により、すべてのアーキテクチャーで Vector API の信頼性と効率性を確保するだけでなく、予想されるネイティブ命令をすべてサポートしていないアーキテクチャーでは API の質の低下を適切に抑えることができます。Vector API の今後の機能拡張には、ベクタークラスをプリミティブクラスとして定義することで実現できる Project Valhalla との整合性も含まれる可能性があります。

注記

Vector API は実装の詳細に関連しているため、この変更によってアプリケーションのソースコードを更新する必要はありません。

詳細は、JEP 448: Vector API (Sixth Incubator) を参照してください。

4.13. メソッドハンドルを使用したコアリフレクション機能の再実装

Red Hat build of OpenJDK 21 には、java.lang.invoke メソッドハンドルの上に java.lang.reflect.Methodjava.lang.reflect.Constructor、および java.lang.reflect.Field クラスの再実装が含まれています。このコアリフレクション機能の再実装により、java.lang.reflect および java.lang.invoke API の保守および開発コストが削減されます。

注記

この変更は再実装に関連しているため、アプリケーションのソースコードを更新する必要はありません。

詳細は、JEP 416: Reimplement Core Reflection with Method Handles を参照してください。

4.14. Foreign Function and Memory API (第 3 プレビュー)

Red Hat build of OpenJDK 21 には、Foreign Function and Memory (FFM) API が含まれています。この API は、Java プログラムが Java ランタイム外のコードとデータを相互運用できるようにするプレビュー機能です。FFM API は、JVM 外部の外部関数を効率的に呼び出し、JVM が管理しない外部メモリーに安全にアクセスできます。

FFM API は、既存の Java Native Interface (JNI) を pure Java 開発モデルに置き換え、ネイティブライブラリーを呼び出し、ネイティブデータを処理するためのより効率的で、クリーンかつ安全な方法を提供します。

FFM API は、ライブラリーおよびアプリケーション内のクライアントコードが次のタスクを実行できるようにするクラスとインターフェイスを定義します。

  • MemorySegmentArena、および SegmentAllocator インターフェイスを使用して、外部メモリーの割り当てと割り当て解除を制御します。
  • MemoryLayout および VarHandle インターフェイスを使用して、構造化外部メモリーを操作およびアクセスします。
  • LinkerFunctionDescriptorSymbolLookup インターフェイスを使用して外部関数を呼び出します。

FFM API は、java.base モジュールの java.lang.foreign パッケージにあります。

注記

FFM API は Java 言語への実験的な追加機能であり、今後のバージョンで改善される可能性がありますが、下位互換性は保証されません。

詳細は、JEP 442: Foreign Function & Memory API (Third Preview) を参照してください。

4.15. レコードパターン (プレビュー)

Red Hat build of OpenJDK 21 では、レコードパターンが導入されています。これは、レコード値を分解するために Java プログラミング言語を強化するプレビュー機能です。この機能により、instanceof Operator を使用する変数の宣言と割り当てが可能になります。

属性 xy を持つ Point という名前のレコードの次の宣言を考えてみましょう。

record Point(int x, int y) {}

前述の宣言に基づいて、次のコードは値が Point のインスタンスであるかどうかをテストし、値から x および y コンポーネントを直接抽出することもできます。

if (obj instanceof Point(int x, int y)) {
    	System.out.println(x+y);
}

この機能は、他のレコード内にネストされたレコードでも使用できます。たとえば、属性が Point レコードと Color 列挙型の ColoredPoint レコードの属性を持つ、Rectangle という名前のレコードに対する以下の宣言を考えてみます。

record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

前述の宣言に基づいて、次のコードは値が Rectangle のインスタンスであるかどうかをテストし、左上の点から色を抽出できます。

if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
     	System.out.println(ul.attribute());
}

詳細は、JEP 440: Record Patterns を参照してください。

4.16. 無名パターンと変数 (プレビュー)

Red Hat build of OpenJDK 21 では、無名パターンと変数が導入されています。これは、Java プログラミング言語を強化するプレビュー機能です。

  • 無名パターン は、コンポーネントの名前またはタイプを指定せずにレコードコンポーネントと一致します。無名パターンは、不要なネストされたパターンを省略することで、レコードパターンの読みやすさを向上させるのに役立ちます。
  • 無名変数 は初期化できますが、使用することはできません。無名変数は、宣言する必要がある変数 (たとえば、catch 句内) が使用されていない変数を識別することにより、すべてのコードの保守性を向上させるのに役立ちます。

無名パターンと無名変数は、アンダースコア (_) 文字を使用して表すことができます。変数が関連がなく、使用されない場合は、変数に名前を付ける必要はありません。このような状況では、アンダースコア文字を使用して、変数は存在するが使用されていないことを指定できます。

次の lambda 式の例では、パラメーターは関係がないため、JVM はこのパラメーターの変数を作成する必要がありません。

...stream.collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA"))

次の switch ステートメントの例では、変数は 大文字と小文字 が一致する必要がありますが、これらの変数は使用されません。

switch (b) {
	case Box(RedBall _), Box(BlueBall _) -> processBox(b);
	case Box(GreenBall _)            	-> stopProcessing();
	case Box(_)                      	-> pickAnotherBox();
}

前の例では、最初の 2 つのケースでは、右側で Box レコードのコンポーネントが使用されないため、無名パターン変数が使用されています。3 番目のケースは新しいもので、無名パターンを使用して、Box レコードを null コンポーネントと一致させます。

詳細は、JEP 443: Unnamed Patterns and Variables (Preview) を参照してください。

4.17. 文字列テンプレート (プレビュー)

Red Hat build of OpenJDK 21 では、Java プログラミング言語を強化するプレビュー機能である文字列テンプレートが導入されています。文字列テンプレートは、リテラルテキストを埋め込み式およびテンプレートプロセッサーと結合して特殊な結果を生成することにより、Java の既存の文字列リテラルとテキストブロックを補完します。

文字列テンプレート機能には、検証と変換をサポートするテンプレートプロセッサーである STR ユーティリティーが含まれており、文字列を設定する Java プログラムのセキュリティーの向上に役立ちます。STR ユーティリティーはコードの読みやすさも向上させます。他の変数、属性、または関数を使用して文字列を作成できます。

たとえば、次のテンプレート式を考えてみましょう。

STR."\{username} access at \{req.date} from \{getLocation()}"

上記の式は、次のサンプル文字列を生成します。

“Guest access at 12/1/2024 from 127.0.0.1”

プレビュー機能は Java 言語への実験的な追加機能であり、今後のバージョンで改善される可能性がありますが、下位互換性は保証されません。

詳細は、JEP 430: String Templates (Preview) を参照してください。

4.18. 無名クラスとインスタンスの main() メソッド (プレビュー)

Red Hat build of OpenJDK 21 では、無名クラスとインスタンスの main() メソッドが導入されています。これは、教育目的で Java プログラミング言語を強化するプレビュー機能です。

無名クラスとインスタンス main() メソッドを使用すると、大規模で複雑なプログラムの Java 言語機能を理解していなくても、簡潔な方法で基本的な Java プログラムを書き始めることができます。Java の別の方言を使用するのではなく、単一クラスプログラムの合理化された宣言を記述し、Java の知識が増えるにつれて、より高度な機能を使用するようにプログラムをシームレスに変更できます。

ソースコードを簡素化し、学生が自分のコードに集中できるようにするために、Java では、学生が次の基準を満たすインスタンス main() メソッドを起動できます。

  • 静的ではない
  • 公開する必要がない
  • String[] パラメーターが必要ない

以下に例を示します。

class HelloWorld {
	void main() {
    		System.out.println("Hello, World!");
	}
}

学生がオブジェクト指向の概念を学習する前にコードの作成を開始できるように、Red Hat build of OpenJDK 21 では、クラス宣言を暗黙的にする無名クラスも導入されています。以下に例を示します。

void main() {
	System.out.println("Hello, World!");
}

この機能をテストするには、プレビュー機能を有効にしてください。以下に例を示します。

  • プログラムをコンパイルして実行する場合は、次のコマンドを入力します。

    javac --release 21 --enable-preview Main.java
    java --enable-preview Main
  • ソースコードランチャーを使用する場合は、以下のコマンドを入力します。

    java --source 21 --enable-preview Main.java

詳細は、JEP 445: Unnamed Classes and Instance Main Methods (Preview) を参照してください。

4.19. スコープ付きの値 (プレビュー)

Red Hat build of OpenJDK 21 では、スコープ値が導入されています。これは、scoped value 変数をサポートする API を提供するプレビュー機能です。通常、scoped value 変数は、多くのメソッドからアクセスできる最終的な静的フィールドとして宣言されます。

scoped value は、メソッドパラメーターを使用せずにメソッド間で変数を共有する安全で効率的な方法を提供します。scoped value は、メソッド自体でパラメーターを宣言しなくてもメソッドが使用できる暗黙的なメソッドパラメーターに相当します。scoped value オブジェクトにアクセスできるメソッドのみがそのデータにアクセスできます。scoped value を使用すると、アプリケーションは、このデータのパラメーターを宣言せず、そのデータにアクセスできない他の中間メソッドを介して、呼び出し元から呼び出し先にデータを安全に渡すことができます。scoped value は、特に多数の仮想スレッドを使用する場合に、thread-local 変数の代わりとして推奨されます。

呼び出し先メソッド (bar) がネストされたバインディング内にある同じ scoped value を使用して、別の呼び出し先メソッド (baz) に異なる値を送信できる次のコード例を見てみましょう。

private static final ScopedValue<String> X = ScopedValue.newInstance();

void main() {
	ScopedValue.where(X, "hello").run(() -> bar());
}

void bar() {
	System.out.println(X.get()); // prints hello
	ScopedValue.where(X, "goodbye").run(() -> baz());
	System.out.println(X.get()); // prints hello
}

void baz() {
	System.out.println(X.get()); // prints goodbye
}

前の例では、main() メソッドは scoped value Xhello に設定し、この値を bar() メソッドに送信します。bar() メソッドは hello (X の値) を出力し、ネストされたバインディングを使用して X の値を変更し、変更された値を baz() メソッドに送信します。baz() メソッドが戻ると、bar() メソッドの残りの部分には、X の元の hello 値が残ります。

詳細は、JEP 446: Scoped Values (Preview) を参照してください。

4.20. 構造化並列性 (プレビュー)

Red Hat build of OpenJDK 21 では、構造化並列性が導入されています。これは、異なるスレッドで実行されている関連タスクのグループを 1 つの作業単位として扱うために API を提供するプレビュー機能です。この API は並行プログラミングを簡素化し、エラー処理と取り消しを効率化し、読みやすさを向上させ、監視性を強化します。

構造化並列性パラダイムでは、タスク (つまり、スレッド) をサブタスクに分割でき、サブタスクをさらにサブタスクにネストすることもできます。このタイプのタスク階層により、取り消しの伝播 (つまり、タスクを取り消すと、そのサブタスクも自動的に取り消される) と、タスク間の相互作用をより適切に制御できるようになります。

以下に例を示します。

Response handle() throws ExecutionException, InterruptedException {
	try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    	Supplier<String>  user  = scope.fork(() -> findUser());
    	Supplier<Integer> order = scope.fork(() -> fetchOrder());

    	scope.join()        	// Join both subtasks
         	.throwIfFailed();  // ... and propagate errors

    	// Here, both subtasks have succeeded, so compose their results
    	return new Response(user.get(), order.get());
	}
}

上記の例では、最初にスコープを作成し、次にこのスコープをフォークしてサブタスクを作成します。いつでも、元のスレッドまたはいずれかのサブタスクからスコープのシャットダウンを要求して、未完了のタスクをすべてキャンセルし、新しいサブタスクが作成されないようにすることができます。scope.join() メソッドは、スコープがすべてのサブタスクの実行が完了するまで待機させます。.get() メソッドは各サブタスクの結果を返します。

各サブタスクは、独自の StructuredTaskScope を作成して、ワークロードをさらにサブタスクに分割することもできます。この場合、追加のサブタスクは、全体の階層内で親サブタスクの下にネストされます。

詳細は、JEP 453: Structured Concurrency (Preview) を参照してください。

第5章 移行の準備

Red Hat build of OpenJDK 21 には、Red Hat build of OpenJDK バージョン 8、11、または 17 にすでに正常にデプロイされているアプリケーションの再設定が必要になる可能性がある変更が含まれています。

必要に応じて次のタスクを完了することで、効果的な移行計画を確実に実行できます。

Red Hat は、移行タスクを支援するために使用できる Migration Toolkit for Applications (MTA) ツールを提供しています。MTA ツールを使用して、Java アプリケーションを Red Hat build of OpenJDK バージョン 8、11、または 17 から Red Hat build of OpenJDK 21 に移行できます。

第6章 アプリケーション移行用のツール

アプリケーションを Red Hat build of OpenJDK 8、11 または 17 から Red Hat build of OpenJDK 21 に移行する前に、ツールを使用して、Red Hat build of OpenJDK 21 で実行するアプリケーションの適合性をテストできます。

次の手順を使用して、テストプロセスを強化できます。

  • サードパーティーのライブラリーを更新します。
  • アプリケーションコードをコンパイルします。
  • アプリケーションのコードで jdeps を実行します。
  • Migration Toolkit for Applications (MTA) ツールを使用して、Java アプリケーションを Red Hat build of OpenJDK 8、11、または 17 から Red Hat build of OpenJDK 21 に移行します。

法律上の通知

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る