原文はこちら。
The original article was written by Sharat Chander (Director, Java SE Product Management, Oracle).
https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15
2020年はJavaの25周年を祝っています。
Moved by Java.
https://oracle.com/movedbyjava
その間、Javaは、Java 5のジェネリクス、Java 8のラムダ式、Java 9のモジュールなど、これまでの機能強化の勢いの上に築かれた20年以上のイノベーションをユーザーに提供してきました。これらは、Javaプラットフォームのパフォーマンス、安定性、セキュリティの向上につながっています。
Javaの継続的な技術革新の道筋を示すために、OracleはJava 15の一般提供を発表いたします。これは6ヶ月サイクルの6回目のフィーチャーリリースです。この2年間でこのレベルの(リリースの)予測可能性により、開発者はインクリメンタルかつ期待される変化の安定した流れストリームのおかげで、より簡単にイノベーションの採用を管理できます。

Java 15 is now available
Oracleは全ての開発者、エンタープライズに対しJava 15を提供いたします。
Oracle Announces Java 15
https://www.oracle.com/news/announcement/oracle-announces-java-15-091520.html
OracleはOracle OpenJDK 15をオープンソース(GPLv2+CPE)で提供いたします。また、商用サポートを求める人やOracle製品やサービスの一部として利用する人向けに、Oracle JDK 15を商用ライセンスで提供します。
Java SE Downloads
https://oracle.com/javadownload
Oracle JDK 15は、Oracle Critical Patch Update(CPU)のスケジュールに従って、四半期に最低2回のアップデートの後、Oracle JDK 16に続きます。Java 16は2021年3月に一般公開される予定で、Oracle OpenJDK 16の早期アクセスビルドはすでにjdk.java.netで提供されています。
Critical Patch Updates, Security Alerts and Bulletins
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
JDK 16 Early-Access Builds
https://jdk.java.net/16/
Java 15, Together
Java 11から14までと同様に、OpenJDKコミュニティの多数の個人や企業からのJava 15に対する貢献を引き続きお祝いしています。
Building JDK 11 Together
https://blogs.oracle.com/java-platform-group/building-jdk-11-together
https://orablogs-jp.blogspot.com/2018/10/building-jdk-11-together.html
The arrival of Java 12!
https://blogs.oracle.com/java-platform-group/the-arrival-of-java-12
The arrival of Java 13!
https://blogs.oracle.com/java-platform-group/the-arrival-of-java-13
https://logico-jp.io/2019/09/17/the-arrival-of-java-13/
The Arrival of Java 14!
https://blogs.oracle.com/java-platform-group/the-arrival-of-java-14
https://logico-jp.io/2020/03/18/the-arrival-of-java-14/
JDK 15 Fix Ratio
JDK の全体的な経年変化率は長年にわたって基本的に一定でしたが、6ヶ月という期間では、production-readyなイノベーションを提供するペースが大幅に改善されました。
数年ごとに大規模なメジャーリリースで何万もの修正と約100のJDK拡張提案(JEP)を提供するのではなく、より管理しやすく、予測可能な6ヶ月間のスケジュールで、より小さな機能リリースで拡張が提供されています。これらの変更は、重要な機能から小規模な機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善まで多岐にわたります。それぞれの変更は、JDK Bug System の 1 つのIssueに対して 1 つのコミットで表現されています。
JDK Bug System
https://bugs.openjdk.java.net/secure/Dashboard.jspa
Java 15でfixedとしてマークされた2136個のJIRAのIssueのうち、1702個がOracleの担当者によって完成されたもので、434個は個人開発者やその他の組織に勤める開発者による貢献でした。Issueを調べ、担当した者の組織のデータを照合したところ、Java 15のfixの開発を支援する組織をグラフ化すると以下のようでした。

Oracleは、ARM、Amazon、IBM、Intel、NTTデータ、Red Hat、SAP、Tencentなどの組織で働いている開発者の顕著な貢献に感謝しています。 また、Ampere Computing、Bellsoft、Longsoon、そしてJava 15の修正の3%をまとめて貢献してくれた個人開発者など、より小さな組織からの貢献にも感謝しています。そして最後に、DataDogとMicrosoftからの最初の貢献に感謝したいと思います。
また、提案された変更点をレビューしてくれた多くの経験豊富な開発者、アーリーアクセスビルドを試して問題点を報告してくれたアーリーアダプター、そして OpenJDK メーリングリストでフィードバックを提供してくれた献身的な専門家の方々にも感謝しています。
以下の個人の方々からの貢献に非常に感謝しております。彼らはビルド品質に関する有用なフィードバックを提供してくれたり、品質のバグを記録したり、頻繁にアップデートを提供してくださいました。
- Uwe Schindler (Apache Lucene)
- Xeno Amess (Apache Maven)
- Tilman Hausherr (Apache PDFBox)
- Mark Thomas (Apache Tomcat)
- Raphael Winterhalter (Byte Buddy)
- Simone Bordet (Eclipse Jetty)
- Peter Karich (Graphhopper)
- Marc Hoffmann (JaCoCo)
- Vincent Privat (JOSM)
- Christian Stein (JUnit)
- Norman Maurer (Netty)
New in Java 15
Java 15では14個の大きな機能拡張や変更があります。この中には1個のインキュベーターモジュール、3個のプレビュー、2個の削除が含まれます。
JDK 15
https://openjdk.java.net/projects/jdk/15/
インキュベーターモジュールとして導入されている機能拡張がありますが、これは最終化されていないAPIやツールを開発者に提供する手段で、これにより、開発者はJavaプラットフォームの品質を最終的に改善できるフィードバックを提供できます。
JEP 11: Incubator Modules
https://openjdk.java.net/jeps/11
同様に、機能強化の中にはPreviewとして提供されているものもあります。これは完全に仕様に含められ、実装されてはいるけれどもまだ変更の可能性があるJava SEプラットフォームの言語やVM機能です。実際の使用に基づいた開発者のフィードバックを促すために、これらはJDKのフィーチャーリリースで利用可能であり、将来のリリースでは恒久的な機能になる可能性があります。このおかげで開発者がタイムリーにフィードバックを提供できる機会が得られるとともに、ツールベンダーがJava開発者の多数が本番で利用する前にこの機能のサポートを作成できる機会を得ることができます。
JEP 12: Preview Features
https://openjdk.java.net/jeps/12
最後に、変更の中にはDeprecation(非推奨化)により、JDKのサイズやスコープを削減を意図するものがあります。これはAPIのライフサイクルに関する情報を伝えるための手段です。Deprecationにより、アプリケーションにその非推奨APIからの移行を促し、アプリケーションが非推奨APIに新たな依存関係を形成しないようにし、非推奨APIに依存し続けることのリスクを開発者にお知らせしています。Java 9で導入されたjdeprscanツールを使用すると、ユーザーは、JARファイル(またはクラスファイルの他の集合体)の静的分析を実行して、非推奨API要素の使用を特定することができ、将来の削除に備えて事前に準備することができます。
JEP 277: Enhanced Deprecation
https://openjdk.java.net/jeps/277
jdeprscan
https://docs.oracle.com/javase/9/tools/jdeprscan.htm
https://docs.oracle.com/javase/jp/9/tools/jdeprscan.htm
JDK 9
https://openjdk.java.net/projects/jdk9/
Java 15の14個のJEPを5つの異なるカテゴリーに分けることができます。
New Features
JEP 339 Edwards-Curve Digital Signature Algorithm
この機能は、RFC 8032で説明されているEdwards-Curve Digital Signature Algorithm (EdDSA)を使用した暗号署名を実装することで、セキュリティとパフォーマンスを向上させます。EdDSAは現代の楕円曲線署名方式であり、JDKの既存の署名方式に比べて利点があります。本JEPの第一の目的は、RFC8032で標準化されたこの方式の実装です。この新しい署名スキームはECDSAを置き換えるものではありません。
Edwards-Curve Digital Signature Algorithm (EdDSA)
https://tools.ietf.org/html/rfc8032
JEP 371 Hidden Classes
この機能は実行時にクラス生成を必要とするフレームワークをアシストするものです。フレームワークは動作を動的に拡張するためにクラスを生成しますが、それらのクラスへのアクセスを制限すべきです。Hidden Classは、通常のバイトコードからではなく、リフレクションを介してのみアクセスできるので便利です。さらに、Hidden Classは他のクラスとは独立してアップロードできるので、フレームワークのメモリフットプリントを減らすことができます。
Modernizing Existing Code
JEP 373 Reimplement the legacy Datagram Socket API
この機能は、java.net.DatagramSocket
および java.net.MulticastSocket
API の基礎となる実装を、よりシンプルでモダンな実装に置き換えることで、JDK の保守性と安定性を向上させました。新しい実装は、現在Project Loomで検討されている仮想スレッドの動作に簡単に適応できるようになります。これは、レガシーSocket APIを再実装したJEP 353に続くものです。
Loom – Fibers, Continuations and Tail-Calls for the JVM
https://openjdk.java.net/projects/loom/
JEP 353: Reimplement the Legacy Socket API
https://openjdk.java.net/jeps/353
Preview and Experimental Features that are now Finalized
JEP 377 ZGC: A Scalable Low-Latency GC
ZGCはJDK 11にJEP 333で統合されました。ZGCは、
- GCの一時停止時間を削減して生産性を向上
- 比較的小さいヒープ(数百メガバイト)から非常に大きなヒープ(テラバイト超)までを処理
- colored pointerやload barrierを活用した、将来のGC機能や最適化のための基礎を築く
ことを目的としています。JEP 377で、ZGCは実験的な機能から本番利用可能な機能に変わりました。
JEP 378 Text Blocks
JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
https://openjdk.java.net/jeps/333
JDK 11
https://openjdk.java.net/projects/jdk/11/
テキストブロックは2019年にJEP 355で提案されました。テキストブロックは複数行の文字列リテラルで、ほとんどのエスケープシーケンスが不要で、予測可能な方法で文字列を自動的にフォーマットし、開発者は必要に応じてフォーマットを制御できます。JEP 378で、テキストブロックはJava言語の恒久的な機能になりました。
JEP 355: Text Blocks (Preview)
https://openjdk.java.net/jeps/355
JEP 379 Shenandoah
ShenandoahはJEP 189でJDK 12 に統合されましたが、他の新しいGC、特にEpsilon GCやZGCのステータスと一致させるために、実験的なものとしてマークされていました。JEP 379で Shenandoah GCを実験的機能から製品機能に変更しましたが、デフォルトのGCの変更は提案しておらず、、G1のままです。そして最新のJDKと人気のあるLTS/STS JDKの両方をサポートし続けるShenandoahの開発プロセスの変更は提案していません。
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
https://openjdk.java.net/jeps/189
Incubating and Preview Features
JEP 360 Sealed Classes – first preview
このプレビュー機能は、以下の目的で、Sealedクラスやインターフェースを使ったJavaプログラミングを強化することで、開発者の生産性を向上させることを意図しています。
- クラスやインタフェースの作者がどのコードを実装可能にするかを制御できるようにする
- アクセス修飾子よりも宣言的にスーパークラスの使用を制限する方法を提供する
- 網羅的なパターン分析を下支えすることで、パターンマッチングの将来的な方向性をサポートする
Pattern Matching for Java
https://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
JEP 375 Pattern Matching for instanceof – second preview
JDK 14 の一部として JEP 305 で初めて導入されたこのプレビュー機能により、一般的なボイラープレート・コードの必要性を排除することで開発者の生産性を向上させ、より簡潔な型安全コードを可能にします。
JEP 305: Pattern Matching for instanceof (Preview)
https://openjdk.java.net/jeps/305
JDK 14
https://openjdk.java.net/projects/jdk/14/
JEP 384 Records – second preview
開発者の生産性を向上させるために、不変データの透過的なキャリアとして機能するクラスを宣言するためのコンパクトな構文であるRecordsを提供します。Recordsは2019年半ばにJEP 359で提案され、JDK 14でプレビュー機能として提供されました。このJEPでは、フィードバックに基づく改善を組み込み、また、Java言語のローカルクラスやインターフェイスの追加形態をサポートするために、JDK 15でこの機能を再プレビューすることを提案しています。
JEP 359: Records (Preview)
https://openjdk.java.net/jeps/359
JDK 14
https://openjdk.java.net/projects/jdk/14/
JEP 383 Foreign-Memory Access API – second incubator
Foreign-Memory Access APIはJEP 370で提案され、インキュベートAPIとして2019年後半のJDK 14をターゲットにしていました。このJEPでは、フィードバックに基づく改善を組み込み、JDK 15でAPIを再インキュベートすることを提案しています。このインキュベート機能は、JavaプログラムがJavaヒープ外の外部メモリに安全かつ効率的にアクセスできるようにするAPIを定義しています。
JEP 370: Foreign-Memory Access API (Incubator)
https://openjdk.java.net/jeps/370
JDK 14
https://openjdk.java.net/projects/jdk/14/
Deprecations and Removals
これまでのフィーチャーリリースと同様に、JDK 15では時代遅れの機能を非推奨にしたり、以前非推奨にした機能を削除したりしています。
JEP 374 Disable and deprecate biased locking
JEP 374では、デフォルトでbiased lockingが無効にされ、全ての関連するコマンドラインオプションが非推奨化されました。
JEP 385 Deprecate RMI Activation for Removal
JEP 385では、将来の削除のために、RMIアクティベーションのメカニズムを非推奨にしました。RMIアクティベーションは、Java 8以降オプションとなっているRMIの時代遅れの部分です。この非推奨化により、RMI の他の部分が非推奨になることはありません。
Remote Object Activation
https://docs.oracle.com/en/java/javase/14/docs/specs/rmi/activation.html
JEP 372 Remove the Nashorn JavaScript Engine
JEP 372で、Nashorn JavaScript スクリプトエンジンと API、jjs ツールが削除されました。将来のリリースでの削除を意図して、エンジン、API、ツールはJDK 11で非推奨化されていました。
JEP 335: Deprecate the Nashorn JavaScript Engine
https://openjdk.java.net/jeps/335
JEP 381 Remove the Solaris and SPARC Ports
JEP 381 で、Solaris/SPARC、Solaris/x64、Linux/SPARC ポートのソースコードとビルドサポートが削除されました。将来のリリースでの削除を意図して、これらのポートはJDK 14で削除対象として非推奨化されていました。
JEP 362: Deprecate the Solaris and SPARC Ports
https://openjdk.java.net/jeps/362
Tooling Support
最新のツールサポートにより、開発者の生産性が向上します。 Java 15でも、開発者に現行のJavaバージョンのサポートを提供するツール・ソリューションを提供しているIDEベンダーの努力を歓迎し続けています。以下のIDEでJava 15がサポートされています。
- JetBrains IntelliJ IDEA
Java 15 and IntelliJ IDEA
https://blog.jetbrains.com/idea/2020/09/java-15-and-intellij-idea/ - Apache NetBeans
- Eclipse Marketplace
Javaはソフトウェア・プログラマーが選択するプログラミング言語の第1位であり続けています。Java 15での改善がオンタイムでのデリバリが示すように、継続的に綿密に計画し、エコシステムへ関与しているため、クラウドでのモダンな開発と成長のためにJavaプラットフォームはよい位置にあります。