原文はこちら。
The original article was written in Sharat Chander (Senior Director, Java SE Product Management, Oracle).
https://inside.java/2023/09/19/the-arrival-of-java-21/
JavaとOpenJDKのX (a.k.a. Twitter) をフォローしてください。
Oracleは、JDK 21の一般提供を開始したことを発表します。このリリースは、6ヶ月のリリース・サイクルを通じて予定通りに提供される12番目の機能リリース (Feature release) です。このレベルの予測可能性により、開発者は期待される改善が着実に出てくるおかげで、イノベーションの採用を容易に管理できます。

Javaは、パフォーマンス、安定性、セキュリティを高めることができるため、世界で最も人気のあるプログラミング言語であり続けています。
JDK 21 is Now Available!
Oracleは現在、開発者、エンドユーザー、エンタープライズ向けにJDK 21を提供しています。
Oracle Releases Java 21 and Extends Support Roadmap
https://www.oracle.com/news/announcement/ocw-oracle-releases-java-21-2023-09-19/
OracleはJava 21の長期サポート (Long Term Support, LTS) を少なくとも8年間提供します。このサポート期間の延長により、企業は最小限のメンテナンスでアプリケーションを長く稼動させ、最終的には独自の条件で柔軟に移行できるようになります。顧客からのフィードバックとJavaエコシステムでの利用状況に基づいて、Oracleは、Java 11の長期サポートを少なくとも2032年1月まで延長し、Oracleからのサポートとアップデートを少なくともさらに8年間提供することも発表します。
Java 21, Together
これまでのリリースと同様、Java 21では、OpenJDKコミュニティの多くの個人や組織の貢献を称え、みんなでJavaを作り上げることを目指します。
JDK 21 Fix Ratio
JDKリリースの時間経過に伴う変化の割合は、何年もの間、ほぼ一定に保たれてきましたが、6ヶ月のサイクル下で、実運用に耐えうる機能や改善が提供されるペースは急激に増加しています。
かつてのメジャーリリース (Major Releases) のように、数万件の修正や100近いJEP (JDK Enhancement Proposals) を数年ごとに提供するのではなく、機能強化はより管理しやすく、予測可能な6ヶ月のスケジュールで、より簡潔な機能リリース (Feature Releases) としてリリースされます。変更の範囲は、重要な新機能から小規模な機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善まで多岐にわたります。個々の変更は、JDK Bug Systemの1つのIssueに対する1つのCommitで表現されます。
Java 11からJava 21でGA時に修正済みとされた24,196件のJIRA のIssueのうち、17,288件はOracle従業員が完了し、6,908件は個人の開発者や他の組織で働く開発者による貢献でした。Issueを調べ、担当者の組織データを照合した結果、Javaのコントリビューション開発のスポンサーとなった組織は下図のようでした。

Java 21では、修正済みとマークされた2,585のJIRAのIssueのうち、1,868件はOracle従業員が完了し、717件はJavaコミュニティの他のメンバーの貢献によるものでした。Oracleは、Amazon、ARM、Azul、Google、Huawei、IBM、Intel、ISCAS、Red Hat、Rivos、SAP、Tencentなどの組織で働く開発者の顕著な貢献に感謝いたします。また、BellsoftやLoongsonのような小規模な組織や、Java 21の修正の8%におよぶ独立系開発者からの貢献にも感謝しています。
さらに、OpenJDK Quality Outreach プログラムを通じて、Java 21 の早期アクセスビルドのテストに素晴らしいフィードバックを提供し、リリースの品質向上に貢献してくれた以下の FOSS プロジェクトにも感謝したいと思います。
さらに、OpenJDK Quality Outreachプログラムを通じて、Java 21の早期アクセスビルドのテストに優れたフィードバックを提供し、リリースの品質向上に貢献してくださった以下のFOSSプロジェクトと個人の方々に感謝いたします。
OpenJDK Quality Outreach
https://wiki.openjdk.org/display/quality/Quality+Outreach
- Apache Commons
- Apache ZooKeeper
- AssertJ
- BNYM Code Katas
- JUnit5
- Karate
- MyBatis
New in Java 21
何千ものパフォーマンス、安定性、セキュリティのアップデートとともに、Java 21では多数の新機能と機能拡張を提供します。それらの機能拡張のうち、15個は非常に重要で独自のJDK Enhancement Proposals (JEPs) があって当然なものであり、残りは6個のプレビュー機能と1個のインキュベーター機能です。
JDK 21
https://openjdk.java.net/projects/jdk/21
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.org/jeps/1
JEPプレビュー機能は、Java SEプラットフォームの言語機能またはVM機能として完全に仕様書に規定され、完全に実装されたものではありますが、まだ不完全なものです。これらは、将来のリリースで恒久的なものになる前に、JDK機能リリースで利用可能にすることで、実際の使用に基づいた開発者のフィードバックを収集できます。またツールベンダーは、Java SE Standardに最終化される前の機能のサポートに取り組む機会を得られます。
JEP 12: Preview Features
https://openjdk.org/jeps/12
JEPインキュベーターモジュールにより、最終化されていないAPIやツールを開発者やユーザーの手元に届けることで、最終的にJavaプラットフォームの品質を向上させるためのフィードバックを集めることができます。
JEP 11: Incubator Modules
https://openjdk.org/jeps/11
Java 21とともに提供される15個のJEPを、主要な長期Java技術プロジェクトとハードウェア・サポートに対応する6つのカテゴリーに分類しました。
Project Amber
JEP 430: String Templates (Preview)
| 目的 | 実行時に計算される値を含む文字列を簡単に表現できるため、Javaプログラムの記述が簡単になります。 文字列リテラルのようにテキストが1つのソース行に収まる場合でも、テキスト・ブロックのように複数のソース行にまたがる場合でも、テキストと式が混在する式の可読性が向上します。 テンプレートと埋め込み式の値の両方の検証と変換をサポートするため、ユーザーが提供した値から文字列を構成し、それを他のシステム(例えば、データベースクエリの構築)に渡すJavaプログラムのセキュリティが向上します。 JavaライブラリがString templateで使用する書式構文を定義できるため、柔軟性があります。 Java以外の言語で書かれた文字列(SQL、XML、JSONなど)を受け付けるAPIの利用が簡単になります。 リテラル・テキストや埋め込み式から計算された文字列でない値を作成できます。中間文字列表現を経由する必要はありません。 |
| 価値 | Project Amberの目標に従い、String TemplatesはJavaプログラミング言語をより読みやすく、書きやすく、保守しやすくすることを目指しています。 |
| 目的 | Recordクラスのインスタンスを非構造化するためにパターンマッチングを拡張してJavaプログラミング言語を強化し、より洗練されたデータ・クエリを可能にします。 ネストされたパターンを追加し、より複雑なデータ・クエリを可能にします。 |
| 関連 | [JDK 19] JEP 405: Record Patterns (Preview) [JDK 20] JEP 432: Record Patterns (2nd Preview) |
| 価値 | パターン・マッチングを拡張して、より洗練された、合成可能なデータ・クエリを表現することで、Java プログラミング言語の生産性が向上します。 |
JEP 441: Pattern Matching for switch
| 目的 | caseラベルにパターンを表示できるようにすることで、switch式およびswitch文の表現力と適用範囲を拡大します。 switchのこれまでのnull-hostilityを必要に応じて緩和できます。 パターンswitch文がすべての可能な入力値をカバーすることを要求することにより、switch 文の安全性が向上します。 既存のすべての switch 式とswitch文が修正しなくてもコンパイルが成功し、同一のセマンティクスで実行されるようにします。 |
| 関連 | Matching for switch (Preview) [JDK 18] JEP 420: Pattern Matching for switch (2nd Preview) [JDK 19] JEP 427: Pattern Matching for switch (3rd Preview) [JDK 20] JEP 433: Pattern Matching for switch (4th Preview) |
| 価値 | 複雑なデータ指向のクエリを簡潔かつ安全に表現できるように、Java プログラミング言語をより意味的 (semantic) にすることで、Java プログラミング言語の生産性が向上します。 |
JEP 443: Unnamed Patterns and Variables (Preview)
| 目的 | 無名パターン (unnamed patterns) とは、コンポーネントの名前や型を記述せずにRecordコンポーネントに一致するもので、無名変数 (unnamed variables) とは、初期化できるが使用できないものです。どちらもアンダースコア文字 _ で示されます。 |
| 価値 | 不要な入れ子パターンを排除することで、record patternの可読性が向上します。 (例えば catch句で) 宣言しなければならないが使用されない変数を識別することで、 すべてのコードの保守性が向上します。 |
JEP 445: Unnamed Classes and Instance Main Methods (Preview)
| 目的 | 教育者がプログラミングの概念を段階的に導入できるよう、Javaへのスムーズな導入路を提供します。 生徒が簡潔な方法で基本的なプログラムを書けるようにし、スキルの成長に合わせてコードを優雅に成長させます。 スクリプトやコマンドラインユーティリティのような簡単なプログラムを書く儀式(おまじない)を軽減します。 Javaの初心者向け方言を別途導入するわけではありません。 初心者向けツールを別途導入するわけではありません。生徒のプログラムは、あらゆるJavaプログラムをコンパイルし実行するのと同じツールでコンパイルし実行されるべきだからです。 |
| 価値 | 定型文や儀式を減らすことによってJava言語を進化させることができます。生徒が大規模なプログラムのために設計された言語機能を理解しなくても、最初のプログラムを書くことができるようになります。 |
Project Loom
| 目的 | シンプルなthread-per-requestスタイルで書かれたサーバーアプリケーションが、ほぼ最適なハードウェア使用率でスケールできるようになります。java.lang.Thread API を使用する既存のコードで、最小限の変更でVirtual threadsを採用できます。既存の JDK ツールを使用して、Virtual threadsのトラブルシューティング、デバッグ、プロファイリングを簡単に行えるようにします。 |
| 関連 | [JDK 20] JEP 436: Virtual Threads (2nd Preview) [JDK 19] JEP 425: Virtual Threads (Preview) |
| 価値 | 高スループットの並列アプリケーションの作成、保守、監視の労力を劇的に削減する軽量スレッドであるVirtual threadsを導入することにより、クラウド環境をターゲットとしたアプリケーションなどのアプリケーション開発の生産性を加速します。 |
JEP 446: Scoped Values (Preview)
| 目的 | スレッド間、スレッド内でイミュータブルなデータの共有を可能にします。 |
| 関連 | [JDK 20] JEP 429: Scoped Values (Incubator) |
| 価値 | 【使いやすさ】スレッド内と子スレッドの両方でデータを共有するプログラミング・モデルを提供し、データ・フローに関する推論をシンプルにします。 【理解しやすさ】コードの構文構造から共有データのライフタイムがわかるようになります。 【堅牢性】呼び出し元が共有するデータを、正当な呼び出し元のみが取得できるようにします。 【パフォーマンス】共有するデータをイミュータブルなデータとして扱うことで、多数のスレッドによる共有が可能であり、実行時の最適化が可能になります。 |
JEP 453: Structured Concurrency (Preview)
| 目的 | structured concurrencyのためのAPIを導入することにより、並列プログラミングを簡素化します。 スレッドリークやキャンセル遅延など、キャンセルやシャットダウンに起因する一般的なリスクを排除できる並列プログラミングのスタイルを促進します。 並列コードの可観測性を向上させます。 |
| 関連 | [JDK 19] JEP 428: Structured Concurrency (Incubator) [JDK 20] JEP 437: Structured Concurrency (2nd Incubator) |
| 価値 | structured concurrencyのためのAPIを導入することで並列プログラミングが簡単になります。このAPI導入により、エラー処理とキャンセルの合理化、信頼性の向上、観測可能性を強化できます。 |
Project Panama
JEP 442: Foreign Function & Memory API (3rd Preview)
| 目的 | JavaプログラムがJavaランタイムの外部のコードやデータと相互運用できるAPIを導入します。外部関数(JVM外のコード)を効率的に呼び出したり、外部メモリ(JVMが管理していないメモリ)に安全にアクセスしたりすることで、このAPIは、Javaプログラムがネイティブ・ライブラリを呼び出したり、ネイティブ・データを処理したりすることができるようになります。JNIのもろさや危険性は考慮の必要がありません。なお、これはプレビューAPIです。 |
| 関連 | [JDK 19] JEP 424: Foreign Function & Memory API (Preview) [JDK 20] JEP 434: Foreign Function & Memory API (2nd Preview) |
| 価値 | 【使いやすさ】Java Native Interface (JNI) を優れたpure Java 開発モデルに置き換えます。 【性能】JNI や sun.misc.Unsafe などの既存の API に匹敵する性能を提供します。【汎用性】さまざまな種類の外部メモリ(ネイティブメモリ、永続メモリ、管理ヒープメモリなど)を操作する方法を提供します。そして時間をかけて、他のプラットフォーム(32ビットx86など)や、C以外の言語(C++、Fortranなど)で書かれた外部関数に対応します。 【安全性】プログラムが外部メモリに対して安全でない操作を実行できますが、デフォルトではそのような操作についてユーザーに警告します。 |
JEP 448: Vector API (6th Incubator)
| 目的 | サポート対象のCPUアーキテクチャ上で最適なベクトル命令に実行時に確実にコンパイルされるベクトル計算を表現するAPIを導入します。これにより、同等のスカラー計算よりも優れた性能を達成します。 本JEPでの主な変更点は以下の通りです。 – ベクトル・マスクに排他的論理和(xor)演算を追加。 – 特にベクトルの要素の並べ替えやベクトル間変換に使用されるベクトル・シャッフルの性能が向上。 |
| 関連 | [JDK 16] JEP 338: Vector API (Incubator) [JDK 17] JEP 414: Vector API (2nd Incubator) [JDK 18] JEP 417: Vector API (3rd Incubator) [JDK 19] JEP 426: Vector API (4th Incubator) [JDK 20] JEP 438: Vector API (5th Incubator) |
| 価値 | ループ内および場合によっては制御フロー内で構成されるベクトル演算のシーケンスからなる広範なベクトル演算を明確かつ簡潔に表現できる API を提供します。 APIはCPUアーキテクチャ非依存ゆえ、ベクトル命令をサポートする複数のアーキテクチャでの実装を可能にします。 x64およびAArch64アーキテクチャ上で信頼性の高いランタイム・コンパイルとパフォーマンスを提供します。 Project Valhallaとの整合性を取ります。 |
Project Valhalla
https://openjdk.org/projects/valhalla/
Core Libraries
JEP 431: Sequenced Collections
| 目的 | encounter order(遭遇順序)が定義されたコレクションを表現するための新しいインターフェースを導入します。このようなコレクションにはそれぞれ、明確に定義された最初の要素、2番目の要素、そして最後の要素まであります。 その最初と最後の要素にアクセスし、その要素を逆順に処理するための統一されたAPIを提供します。 |
| 価値 | encounter order(遭遇順序)が定義された要素の順番を表現するコレクションタイプ全体に適用される統一された操作セットを提供することで、開発者の生産性を向上させます。 |
Performance Updates
| 目的 | young genのオブジェクトとold genのオブジェクトで世代を別々にメンテナンスするためにZ Garbage Collector (ZGC) を拡張し、アプリケーションのパフォーマンスを向上させます。 |
| 価値 | Generational ZGCを使うアプリケーションでは、以下を享受できるはずです。 – 割り当て失速のリスクの低減 – 必要なヒープ・メモリ・オーバーヘッドの低減 – ガベージコレクションのCPUオーバーヘッドの低減 これらの利点は、generational ZGCではないZGCと比較して、スループットを大幅に低下させることなく得られるはずです。generational ZGCではないZGCの本質的な特性は維持されます。 – ポーズタイムが1ミリ秒を超えない – 数百メガバイトから数テラバイトまでのヒープサイズをサポート – 最小限の手動設定ですむ |
JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production)
https://openjdk.org/jeps/377
Tracing garbage collection
https://en.wikipedia.org/wiki/Tracing_garbage_collection#Generational_GC_(ephemeral_GC)
JEP 452: Key Encapsulation Mechanism API
| 目的 | 公開鍵暗号方式を使用して共通鍵を保護するための暗号化技術である、KEM (key encapsulation mechanisms) APIを導入します。 |
| 価値 | RSA Key Encapsulation Mechanism (RSA-KEM)、Elliptic Curve Integrated Encryption Scheme (ECIES)、National Institute of Standards and Technology (NIST) のPost-Quantum Cryptography標準化プロセスの候補KEMアルゴリズムなどのKEMアルゴリズムをアプリケーションで使用できるようにします。 Transport Level Security (TLS) などの上位プロトコルや、Hybrid Public Key Encryption (HPKE、RFC 9180) などの暗号方式で KEM を使用できるようにします。 セキュリティ・プロバイダーがJava コードまたはネイティブコードでKEMアルゴリズムを実装できるようにします。 RFC 9180の4.1で定義されている DHKEM (Diffie-Hellman KEM) の実装を含みます。 |
RFC 9180: Hybrid Public Key Encryption
https://rfc-editor.org/rfc/rfc9180
RFC 9180: Hybrid Public Key Encryption
https://rfc-editor.org/rfc/rfc9180#name-dh-based-kem-dhkem
Maintenance and Deprecation
JEP 449: Deprecate the Windows 32-bit x86 Port for Removal
| 目的 | 将来のリリースで削除することを意図して、Windows 32ビット x86ポートを非推奨にします。 |
| 価値 | Windows 32 ビット x86 (x86-32) 用のビルドを構成しようとしたときにエラーメッセージを発行するようにビルドシステムを更新します。このエラーメッセージは、新しい設定オプションで抑制できるようになります。 ポートおよび関連するポート固有の機能を、関連ドキュメントでdeprecated for removalとしてマークします。 |
JEP 451: Prepare to Disallow the Dynamic Loading of Agents
| 目的 | エージェントが実行中のJVMに動的ロードされるときに警告を発行します。これらの警告は、デフォルトでの一貫性・整合性を向上させるために、エージェントの動的ロードをデフォルトで禁止する将来のリリースに向けてユーザーに準備させることを目的としています。起動時にエージェントをロードする保守ツールは、どのリリースでも警告を発行しません。 |
| 価値 | 実行中の JVM へのエージェントのロードをデフォルトで禁止する将来のJDKリリースに備えます。 実行中のコードへのアドホックな変更を伴うサービス性と、実行中のコードが恣意的に変更されないことを前提とする完全性のバランスを再評価します。 エージェントを動的にロードする必要のない大多数のツールが影響を受けないことを保証します。 エージェントの動的ロードする能力を、ディープリフレクションのような、いわゆる「超能力」と呼ばれる他の能力と整合させます。 |
JEP draft: Integrity and Strong Encapsulation
https://openjdk.org/jeps/8305968
JEP 403: Strongly Encapsulate JDK Internals
https://openjdk.org/jeps/403
Resources
Javaは引き続き、今日の技術トレンドに対応したNo.1プログラミング言語です。Java 21の改良が予定通り行われたことが示すように、綿密な計画とエコシステムの継続的な関与を通じて、Javaプラットフォームは最新の開発とクラウドでの成長に十分対応できる位置にあります。
ニュースやアップデートの最新情報は、以下の方法で入手できます。
| Dev.java | Javaの知識を深め、コミュニティに参加するためのOracleの専用ポータルサイト |
| Inside.java | Oracle Javaチームによるニュースおよび意見を見るためのサイト |
| Inside.java Podcast | Java開発者向けのオーディオ・ショーで、言語、JVM、OpenJDK、プラットフォーム・セキュリティ、LoomやPanamaなどのイノベーション・プロジェクト、そしてその間にあるあらゆることについて、OracleでJavaを作成している人が直接説明します。 |
| Java on YouTube | Javaの専門知識を深めるのに役立つ、OracleのJava関連動画コレクション |
| Inside.java Newscast | Inside.Javaポッドキャストをビデオ形式に拡張したビデオ番組 |
| JEP Café | 人気のあるJEP (JDK Enhancement Proposals) について説明するOracleの動画 |
| OpenJDKメーリングリスト | お気に入りのOpenJDKプロジェクトの進捗状況を把握できるメーリングリスト |
| Twitterのフォロー @OpenJDK @Java | Javaの継続的な進化に関する最新情報とニュースを提供するソーシャルストリーム |