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

Javaは、パフォーマンス、安定性、セキュリティを高めることができるため、世界で最も人気のあるプログラミング言語であり続けています。
JDK 20 is now available!
Oracleは開発者、エンドユーザー、および企業向けにJDK 20を提供します。
Oracle now offers JDK 20
https://oracle.com/news/announcement/oracle-releases-java-20-2023-03-21/
Oracle JDK 20は、長期サポート(LTS)リリースではありません。6ヶ月後にJDK 21に取って代わられるまでの間、アップデートを受けることができます。
Oracle JDK 17(2021年9月14日リリース済み)は、2018年に発表されたリリース・サイクルにおける最新の長期サポート(LTS)です。Oracleは、今後のLTSリリースの間隔を3年から2年に短縮する計画を発表しています。そのため、JDK 21(2023年9月)が次のLTSになる計画です。
Oracle Releases Java 17
https://oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/
JDK 21 (September 2023) is planned to be the next LTS
https://blogs.oracle.com/java/post/moving-the-jdk-to-a-two-year-lts-cadence
https://logico-jp.io/2021/09/15/moving-the-jdk-to-a-two-year-lts-cadence/
Java 20, Together
これまでのリリースと同様、Java 20では、OpenJDKコミュニティの多くの個人や組織の貢献を称え、みんなでJavaを作り上げることを目指します。
JDK 20 Fix Ratio
JDKのリリースでの経時的変化の割合は何年もほぼ一定でしたが、6ヶ月サイクルの下、プロダクションレディな機能や改良が提供されるペースが大幅に改善されました。
かつてのメジャーリリースのように、数年ごとに何万もの修正や100近いJEP(JDK Enhancement Proposals)を提供するのではなく、機能強化は、より管理しやすく、予測可能な6ヶ月のスケジュールで、より無駄のない機能リリースとして提供されます。変更内容は、重要な新機能から小さな機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善まで多岐にわたります。各変更は、JDKバグシステム内の1つの課題に対する1つのコミットで表現されます。
かつてのメジャーリリースのように、数年ごとに何万もの修正や100近いJEP(JDK Enhancement Proposals)を提供するのではなく、より管理しやすく、予測可能な6ヶ月のスケジュールで、より簡潔な機能リリースとして機能強化を提供します。変更内容は、重要な新機能から小さな機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善まで多岐にわたります。各変更は、JDKバグシステム内の1つの課題に対する1つのコミットで表現されます。
System Dashboard – Java Bug System
https://bugs.openjdk.org/secure/Dashboard.jspa
Java 11からJava 20でGA時に修正済みとされた21,604件のJIRAのIssueのうち、15,420件はOracle社員が完了し、6,184件は個人開発者と他の組織に勤務する開発者による貢献でした。Issueを調べ、担当者の組織データを照合した結果、Javaのコントリビューション開発のスポンサーとなった組織は下図のようになりました。Javaにおけるコントリビューションの開発スポンサーは、以下のようになりました。

Java 20では、修正済みとマークされた2,314件のJIRA課題のうち、1,595件はOracle社員が完了し、719件はJavaコミュニティの他のメンバーがコントリビュートくださいました。Oracleは、Alibaba、Amazon、ARM、Google、Huawei、IBM、Intel、ISCAS、Red Hat、SAP、Tencentなどの組織で働く開発者の注目すべきコントリビュートに感謝したいと思います。また、BellsoftやLoongsonなどの小規模な組織や、Java 20の修正点の7%を提供した独立系開発者の貢献にも感謝しています。
また、変更案を検討してくれた多くの経験豊富な開発者、初期アクセスビルドを試して問題を報告してくれたアーリーアダプター、OpenJDKメーリングリストにフィードバックを提供してくれた熱心な専門家にも、同様に感謝しています。
以下の方々は、ビルドの品質に関する貴重なフィードバック、良質なバグの記録、あるいは頻繁なアップデートを提供してくれました。
- Rick Hillegas (Apache Derby)
- Uwe Schindler (Apache Lucene)
- Rafael Winterhalter (Byte Buddy)
- Yoann Rodière (Hibernate projects)
- Marc Hoffman (JaCoCo)
- Lukas Eder (JOOQ)
- Vladimir Sitnikov (AssertJ)
さらに、OpenJDK Quality Outreachプログラムを通じて、Java 20の早期アクセスビルドのテストに優れたフィードバックを提供し、リリースの品質向上に貢献してくださった以下のFOSSプロジェクトと個人の方々に感謝いたします。
OpenJDK Quality Outreach
https://wiki.openjdk.org/display/quality/Quality+Outreach
- Apache Tomcat & Apache Wicket (Martin Grigorov)
- Apache Zookeeper (Enrico Olivelli)
- MyBatis (Iwao Ave)
- RxJava (David Karnok)
- Spoon (Martin Wittlinger)
さらにさらに、数年前から各JDKリリースのEarly Accessテストサイクルにおいて、信頼できる定期的なフィードバックを提供してくれたRick HillegasとApache Derbyチームに感謝いたします。
New in Java 20
Java20では、何千ものパフォーマンス、安定性、セキュリティのアップデートとともに、多数の新機能と拡張機能が提供されています。これらの拡張機能のうち7つは、独自のJDK拡張提案(JEP)を必要とするほど重要で、4つのプレビューと3つのインキュベーターが含まれています。
JDK 20
https://openjdk.java.net/projects/jdk/20
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.org/jeps/1
JEPはないものの最も重要な変更点は、以下の通りです。
- (D)TLS 鍵交換名前付きグループ
((D)TLS Key Exchange Named Groups) - G1GCのRemark/Cleanupポーズ時間のためのGarbageCollectorMXBeanの追加
(Add GarbageCollectorMXBean for Remark and Cleanup Pause Time in G1) - x86_64およびaarch64プラットフォームでのChaCha20 Intrinsicsの提供
(Provide ChaCha20 Intrinsics on x86_64 and aarch64 Platforms) - Unicode 15.0対応
(Unicode 15.0 Support) - G1並行精緻化スレッドの制御性向上
(Improved Control of G1 Concurrent Refinement Threads) - CLDRバージョン42に対応
(Support for CLDR Version 42) - 新しいJFRイベント:
jdk.InitialSecurityProperty
(New JFR Event:jdk.InitialSecurityProperty
) - 新しいJFRイベント:
jdk.SecurityProviderService
(New JFR Event:jdk.SecurityProviderService
) - プレビューAPIページの改善
(Improved Preview API Page) jmod --compress
コマンドラインオプションの追加
(Newjmod --compress
Command Line Option)- BreakIteratorのGrapheme対応
(Grapheme Support in BreakIterator) - タイムゾーンデータの2022cへの更新
(Update Timezone Data to 2022c) - JavaDocの見出しでIDを自動生成
(Auto-Generated IDs in JavaDoc Headings)
これらの新機能やその他多くの新機能の詳細は、リリースノートに記載があります。
JDK 20 Release Notes
https://jdk.java.net/20/release-notes
JEP Preview機能は、Java SEプラットフォームの言語またはVMの機能を完全に規定、実装したものですが、まだ不完全なものです。これらはJDKの機能リリースで利用可能にすることで、将来のリリースで恒久的なものになる前に、実世界での使用に基づく開発者のフィードバックを得ることを目的としています。またこれにより、ツールベンダーは、Java SE Standardに最終的に組み込まれる前に、その機能をサポートするために努力する機会を得ることができます。
JEP 12: Preview Features
https://openjdk.org/jeps/12
JEP Incubatorモジュールは、最終的でないAPIや最終的でないツールを開発者やユーザーの手に渡すことで、最終的にJavaプラットフォームの品質を向上させるためのフィードバックを収集することを目的としています。
JEP 11: Incubator Modules
https://openjdk.org/jeps/11
Java 20に含まれる7個のJEPは、主要な長期Java技術プロジェクトに対応する3つのカテゴリーに分類されています。
Project Amber
https://openjdk.org/projects/amber/
JEP 432 – Record Patterns (2nd Preview)
https://openjdk.org/jeps/423
Project Amberは、パターンマッチを拡張し、より洗練された、合成可能なデータ・クエリを表現することで、開発者の生産性を向上させることを目的としています。これは、record 値を分解するrecordパターンでJavaプログラミング言語を強化することで実現されています。recordパターンとtypeパターンをネストすることで、強力で宣言的、かつ複合的なデータナビゲーションとデータ処理を可能にします。
JEP 432は以下のJEPと関連しています。
- [JDK 19] JEP 405: Record Patterns (Preview)
https://openjdk.org/jeps/405 - [JDK 20] JEP 433: Pattern Matching for switch (4th Preview)
https://openjdk.org/jeps/433
JEP 433 – Pattern Matching for switch (4th Preview)
https://openjdk.org/jeps/433
Javaプログラミング言語において、switch式やステートメントのパターンマッチを強化し、開発者の生産性を向上させることを目的としています。この改良により、式が複数のパターンでテストされてそれぞれが特定の動作をするようになり、複雑なデータ指向のクエリを簡潔かつ安全に表現できるようになります。
JEP 433は以下のJEPと関連しています。
- [JDK 19] JEP 427: Pattern Matching for switch (3rd Preview)
https://openjdk.org/jeps/427 - [JDK 20] JEP 432: Record Patterns (2nd Preview)
https://openjdk.org/jeps/432
Project Panama
https://openjdk.org/projects/panama/
JEP 434 – Foreign Function & Memory API (2nd Preview)
https://openjdk.org/jeps/434
Foreign Function & Memory APIでは、4つのユニークな方法で価値を提供します。
Ease of use | Java Native Interface (JNI) を、優れた純粋なJava開発モデルに置き換え Java Native Interface Specification: Contents https://docs.oracle.com/en/java/javase/18/docs/specs/jni/index.html |
Performance | JNIやsun.misc.Unsafe などの既存のAPIに匹敵する、あるいはそれ以上のパフォーマンスを提供 |
Generality | さまざまな種類の外部メモリ(ネイティブメモリ、永続メモリ、管理ヒープメモリなど)を操作する方法を提供 時間をかけて他のプラットフォーム(32ビットx86など)やC以外の言語(C++、Fortranなど)で書かれた外部関数に対応 |
Safety | プログラムが外部メモリ上で安全でない操作を行うことを許可するものの、デフォルトでそのような操作についてユーザーに警告を出す |
Foreign Function & Memory APIでは、JavaプログラムがJavaランタイム外のコードやデータと相互運用するためのAPIを導入します。F外部関数(JVM外のコード)を効率的に呼び出したり、外部メモリ(JVMが管理していないメモリ)に安全にアクセスすることで、Javaプログラムは、JNIの脆さや危険性を気にせず、ネイティブライブラリの呼び出しやネイティブデータの処理を可能にするAPIです。
JEP 434は以下のJEPと関連しています。
- [JDK 19] JEP 424: Foreign Function & Memory API (Preview)
https://openjdk.org/jeps/424
JEP 438 – Vector API (5th Incubator)
https://openjdk.org/jeps/438
このJEPは、同等のスカラー計算を凌駕する性能を実現することを目的としています。これは、サポート対象のCPUアーキテクチャ上で最適なベクトル命令に実行時に確実にコンパイルされるベクトル計算を表現するAPIを導入することで、同等のスカラー計算よりも優れた性能を実現します。ベクトルAPIは、JDK16から19でインキュベートされていました。JDK 20では、これらのリリースでのユーザーからのフィードバックに加え、性能の向上や実装の強化が盛り込まれています。
JEP 438は以下のJEPと関連しています。
- [JDK 19] JEP 426: Vector API (4th Incubator)
https://openjdk.org/jeps/426
Project Loom
https://openjdk.org/projects/loom/
Project Loomは、利用可能なハードウェアを最大限に活用する高スループットな並列アプリケーションの記述、保守、観測の労力を劇的に削減することを目指しています。Project Loomは2017年後半に始まり、JDK 19以降、6個のJEPが出来ています。
JEP 436 – Virtual Threads (2nd Preview)
https://openjdk.org/jeps/436
Virtual Threadsは軽量なスレッドで、高スループットな並列アプリケーションの記述、維持、観測の労力を劇的に軽減します。
Virtual Threadsは、Project Loomの最初のJEPです。Project Loomは、Javaの並行性モデルをアップグレードして、今日の大規模なサーバーアプリケーションのニーズに対応するものです。
Javaのスレッドには素晴らしい点がたくさんあります。ループ、条件分岐、例外など、ユーザーが理解できる制御フロー演算子を使用した、読みやすい連続したコードで、自然なプログラミングモデルを提供します。ユーザは、優れたデバッグとサービス性、そして読みやすいスタック・トレースを得ることができます。また、スレッドはOSにとって自然なスケジューリングの単位です。私たちは、これらの利点を維持したいと思います。
問題は、OSによるスレッドの実装が非常にヘビーである点です。接続のたびにスレッドを起動するのは時間がかかりすぎますし、さらに悪いことに、OSがサポート可能なスレッドの個数は、サーバーが処理可能な同時トランザクションの数に制限しています。この個数は、ハードウェアやネットワークの能力をはるかに下回る数のため、スレッドはサーバーのスループットを厳しく制限する要因になっています。
多くの人は、いわゆる「リアクティブ」フレームワークが提供する非同期プログラミングスタイルを採用するものと考えていました。同時処理をスレッドとして直接表現しないことで、thread-per-requestモデルがもたらす限界を超えて拡張できますが、大きな代償を払うことになります。具体的には、プラットフォームがすべてのレイヤーとツールでスレッドを中心に構築されているため、読み書きが難しく、デバッグやプロファイルが非常に困難な、より複雑なコードになります。Reactiveは、現在のJVMでできる最善の方法かもしれませんが、私たちの目標は、より良いものを作ることです。それは、スレッドをより軽く、よりスケーラブルにして、開発者が何年もうまく使ってきたモデルやツールを使い続けられるようにすることで実現できます。
現在の開発者の前には、3つの悪い選択肢があります。
- 利用率が低い状態でハードウェアを浪費する
- プログラミングモデルや観測性の問題でプログラマーの労力を浪費する
- Javaから離れる
そこで、Project Loomでは開発者により良い選択肢を提供します。
JEP 429 – Scoped Values (Incubator)
https://openjdk.java.net/jeps/429
Scoped Valuesは、スレッド内およびスレッド間で不変のデータを共有できます。特に多数のVirtual Threadsを使用する場合、スレッドローカル変数よりも優先され、以下のような多くの点で価値があります。
Ease of use | スレッド内と子スレッドの両方でデータを共有するプログラミングモデルを提供し、データフローに関する推論を簡素化 |
Comprehensibility | コードの構文構造から共有データの生存期間を可視化 |
Robustness | 呼び出し元が共有するデータは、正当な呼び出し元のみが取得可能 |
Performance | 共有データを不変のもの (immutable) として扱い、多数のスレッド間の共有を可能にし、実行時の最適化を実現 |
JEP 437 – Structured Concurrency (2nd Incubator)
https://openjdk.java.net/jeps/437
Structured Concurrencyは、構造化された並行処理のためのAPIを導入することで、マルチスレッドプログラミングを簡素化します。これは、構造化並行処理のためのAPIを導入することでマルチスレッドプログラミングを簡素化することによって実現します。構造化並行処理は、異なるスレッドで実行される複数のタスクを単一の作業単位として扱うことで、エラー処理とキャンセルを合理化し、信頼性を向上させ、観測性を高めることを目的としています。
JEP 437は以下のJEPと関連しています。
- [JDK 19] JEP 428: Structured Concurrency (Incubator)
https://openjdk.org/jeps/428
Resources
Javaは引き続き、今日の技術トレンドに対応したNo.1プログラミング言語です。Java 20の改良が予定通り行われたことが示すように、綿密な計画とエコシステムの継続的な関与を通じて、Javaプラットフォームは最新の開発とクラウドでの成長に十分対応できる位置にあります。
ニュースやアップデートの最新情報は、以下の方法で入手できます。
Dev.java | Javaの知識を深め、コミュニティに参加するためのOracleの専用ポータルサイト |
Inside.java | Oracle Javaチームによるニュースおよび意見を見るためのサイト |
Inside.java Podcast | Java開発者向けのオーディオ・ショーで、言語、JVM、OpenJDK、プラットフォーム・セキュリティ、LoomやPanamaなどのイノベーション・プロジェクト、そしてその間にあるあらゆることについて、OracleでJavaを作成している人が直接説明します。 |
Inside.java Newscast | Inside.Javaポッドキャストをビデオ形式に拡張したビデオ番組 |
Java on YouTube | Javaの専門知識を深めるのに役立つ、OracleのJava関連動画コレクション |
JEP Café | 人気のあるJEP (JDK Enhancement Proposals) についてOracleが説明する動画 |
OpenJDKメーリングリスト | お気に入りのOpenJDKプロジェクトの進捗状況を把握できます |
Twitterのフォロー @OpenJDK @Java | Javaの継続的な進化に関する最新情報とニュースを提供するソーシャルストリーム |
Java Magazine | OracleのJavaに関するデジタル出版物 開発者による開発者のための技術記事を提供しています |