The Arrival of Java 16

原文はこちら。
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-16

2020年は、Javaにとって25歳の誕生日を迎えた記念すべき年となりました。

Moved by Java
https://www.oracle.com/java/moved-by-java/

20年以上にわたるイノベーションの中で、Javaは次のようなことを続けてきました。

  • プラットフォームに依存せず、テクノロジーの変化に柔軟に対応
  • 下位互換性を維持することによる信頼性
  • セキュリティを犠牲にせずイノベーションを加速させるパフォーマンス

このように、プラットフォームのパフォーマンス、安定性、セキュリティを向上させるJavaの能力と相まって、Javaは開発者の間で世界で最も人気のあるプログラミング言語であり続けています。IDCの最新レポート「Java Turns 25」によると、全世界のフルタイム開発者の69%にあたる900万人以上の開発者がJavaを使用しており、これは他のどの言語よりも多いのです。

Java Turns 25
https://www.oracle.com/a/ocom/resources/java-turns-25.pdf

Javaの継続的な革新の道をさらに実証するために、Oracleは半年周期で7回目の機能リリース(feature release)となるJava 16の一般提供を発表します。 このレベルの予測可能性により、想定される変更の安定したリリースのおかげで、開発者はイノベーションの採用をより容易に管理することができます。

Java 16 is now available!

Oracleは現在、すべての開発者および企業向けにJava 16を提供しています。 Oracle JDK 16は、Oracle Critical Patch Update (CPU)のスケジュールに従って、最低2回の四半期ごとのアップデートが行われた後、Oracle JDK 17がリリースされる予定になっています。Java 17は2021年9月に一般提供が開始されますが、すでにjdk.java.netで早期アクセスビルドが提供されています。

Oracle Announces Java 16
https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html
Critical Patch Updates, Security Alerts and Bulletins
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
Critical Patch UpdatesとSecurity Alerts
https://www.oracle.com/jp/topics/technologies/security/alerts.html
JDK 17 Early-Access Builds
https://jdk.java.net/17/

今回もOracleは、Java 16をOracle OpenJDKリリースとして、オープンソース [GNU General Public License v2, with the Classpath Exception (GPLv2+CPE) ] で提供するとともに、Oracleの製品やサービスの一部としてOracle JDKリリースを使用する場合や、商用サポートを受けたい場合には、商用ライセンスの下でも提供しています。

JDK 16 General-Availability Release (Oracle OpenJDK)
https://jdk.java.net/16/
Java SE Downloads
https://www.oracle.com/java/technologies/javase-downloads.html

Java 16, Together

これまでのリリースと同様に、OpenJDK Communityの多くの個人や組織からのJava 16への貢献を引き続き称えたいと思います — we all build Java, together!

JDK 16 Fix Ratio

JDKの全体的な変更率は長年にわたって基本的に一定でしたが、6ヶ月サイクルの下では、production-readyの革新的な技術が提供されるペースが大幅に改善されました。

数年に一度の大規模なメジャーリリースで数万件の修正と100件前後のJDK Enhancement Proposals (JEP)を提供するのではなく、より管理しやすく、予測可能な6ヶ月のスケジュールで、小さな機能リリース(feature release)で機能強化を提供します。これらの変更は、重要な機能から小さな機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善など多岐にわたります。それぞれの変更は、JDK Bug Systemの1つの課題に対する1つのコミットで表されます。

JDK Bug System (JBS)
https://bugs.openjdk.java.net/secure/Dashboard.jspa

Java 16で修正されたとマークされた1,897件のIssueのうち、1,397件はOracleの社員が完成させたもので、500件は個人の開発者や他の組織で働く開発者が貢献したものです。問題を調べ、担当者から得た組織データを照合した結果、Java 16の修正プログラムの開発を支援した組織は以下のようになりました。

Oracleは、ARM、SAP、Red Hat、Tencentなどの組織で働く開発者の方々の注目すべき貢献に感謝します。 また、Ampere Computing、Bellsoft、DataDog、Microdocなどの小規模な企業や独立系の開発者の方々が、Java 16の修正の3%に貢献くださったことにも感謝しています。

また、提案された変更点をレビューした多くの経験豊富な開発者、早期アクセス用のビルドを試して問題点を報告してくれたアーリーアダプター、OpenJDKのメーリングリストでフィードバックを提供してくれた熱心な専門家にも同様に感謝しています。

以下の方々からは、ビルドの品質に関する貴重なフィードバックや、良質なバグの記録、頻繁なアップデートの提供をいただきました。

  • Jaikiran Pai (Apache Ant)
  • Gary Gregory (Apache Commons)
  • Uwe Schindler (Apache Lucene)
  • Robert Scholte (Apache Maven)
  • Mark Thomas (Apache Tomcat)
  • Enrico Olivelli (Apache Zookeeper)
  • Rafale Winterhalter (Byte Buddy)
  • Peter Karich (Graph Hopper)
  • Evgeny Yavits (JaCoCo)
  • Marc Hoffman (JaCoCo)
  • Vincent Privat (JOSM)
  • Christain Stein (JUnit 5)
  • David Karnok (RxJava)

さらに、Quality Outreachプログラムを通じて、リリースの品質向上のために、Java 16早期アクセスビルドのテストに優れたフィードバックを提供してくださった以下のFree Open Source Software (FOSS) プロジェクトおよび個人の方々に感謝いたします。

Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach

  • Apache Ant 
  • Apache Derby (Rich Hillegas)
  • Apache Lucene
  • Apache Maven
  • Apache Tomcat
  • Apache Wicket (Martin Grigorov)
  • Apache ZooKeeper
  • Eclipse Collections (Nikhil Nanivadekar)
  • eo-yaml (Mihai Andronache)
  • FXGL (Almas Baimagambetov)
  • FXyz (Sean Phillips)
  • Java Katas (Chandra Guntur)
  • GraphHopper
  • Hibernate ORM
  • Hibernate Validator
  • Hibernate Search
  • Hibernate Reactive (Sanne Grinovero & Yoann Rodiere)
  • JobRunr (Ronald Dehuysser)
  • jOOQ (Lukas Eder)
  • MyBatis (Iwao Ave)
  • Micrometer (Tommy Ludwig)
  • RxJava
  • Sejda
  • PDFsam (Andrea Vacondio)

New in Java 16

何千ものパフォーマンス、安定性、セキュリティに関するアップデートに加え、Java 16では、3つのインキュベーター(Incubator)モジュールと1つのプレビュー機能を含む17の主な機能強化/変更(JDK Enhancement Proposals – JEP)が加わっています。

JDK 16
https://openjdk.java.net/projects/jdk/16/
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.java.net/jeps/1

いくつかの機能強化はインキュベーター・モジュールとして提供されます。インキュベーター・モジュールとは、最終版ではないAPIやツールを開発者に提供することで、ユーザーからのフィードバックを得て、最終的にJavaプラットフォームの品質を向上させる手段です。

JEP 11: Incubator Modules
https://openjdk.java.net/jeps/11

同様に、いくつかの機能強化は、Preview featureとして導入されます。これは、完全に仕様化され、完全に実装されてはいるものの、まだ変更の余地があるJava SE Platformの言語またはVM機能です。これらの機能は、JDKの機能リリースで提供され、実際の使用に基づいた開発者のフィードバックを促すもので、このフィードバックを受けて将来のリリースで恒久的な機能になる可能性があります。これにより、ユーザーはタイムリーなフィードバックが可能で、また、ツール・ベンダーは、多くのJava開発者が本番で使用する前に、その機能のサポートを構築する機会を得ることができます。

JEP 12: Preview Features
https://openjdk.java.net/jeps/12

Java 16で提供された17のJEPは、6つのカテゴリーに分類できます。

1. New Language Features

JEP 394 Pattern Matching for instanceof

Java 14で初めてプレビュー機能として導入され、Java 15で再び導入されました。このパターン・マッチングは、Javaプログラミング言語を強化し、instanceof演算子のパターン・マッチングを実現します。

JEP 305: Pattern Matching for instanceof (Preview)
https://openjdk.java.net/jeps/305
JEP 375: Pattern Matching for instanceof (Second Preview)
https://openjdk.java.net/jeps/375

パターン・マッチングにより、オブジェクトからコンポーネントを条件付きで抽出するというプログラム内の共通ロジックを、より簡潔かつ安全に表現できます。

JEP 395 Records

これもJava 14、Java 15でプレビューとして導入されました。

JEP 359: Records (Preview)
https://openjdk.java.net/jeps/359
JEP 384: Records (Second Preview)
https://openjdk.java.net/jeps/384

Recordは、shallow(浅い。Tupleなので…)でimmutableなデータのための透過的なホルダーであるクラスを宣言するためのコンパクトな構文を提供します。これにより、これらのクラスの冗長性が大幅に削減され、コードの読みやすさと保守性が向上します。

2. JVM Improvements

JEP 376 ZGC Concurrent Thread Processing

JEP 376では、ZGC のスレッド・スタック処理をセーフポイントから並行フェーズに移行したことで、大規模なヒープであっても、GCのセーフポイント内でミリ秒以下の一時停止が可能になりました。ZGCのガベージ・コレクタにおける最終的な遅延の原因を取り除くことにより、本リリースおよびそれ以降のリリースにおいて、アプリケーションの性能と効率が大幅に改善されます。

JEP 387 Elastic Metaspace

この機能は、使用されていないHotSpot VMのクラス・メタデータ(=metaspace、メタスペース)のメモリをより迅速にOSに戻し、メタスペースのフットプリントを削減します。クラスのロードとアンロードが頻繁に行われるアプリケーションでは、未使用のメモリ空間が大量に発生します。

新しいスキームでは、メタスペースのメモリをより小さなチャンクで割り当て、クラスローダのオーバーヘッドとフラグメンテーションを削減します。また、未使用のメタスペースメモリをOSに戻すことで弾力性を高め、アプリケーションのパフォーマンスを向上させ、メモリ使用量を削減します。

3. New Tools and Libraries

JEP 380 Unix-Domain Socket Channels

Unixドメインのソケットは、長い間、ほとんどのUnixプラットフォームの機能でしたが、Windows 10とWindows Server 2019でサポートされるようになりました。この機能は、java.nio.channelsパッケージのソケットチャンネルとサーバーソケットチャンネルのAPIに、Unixドメイン(AF_UNIX)ソケットのサポートを追加します。これにより、継承されたチャネルメカニズムが拡張され、Unixドメインのソケットチャネルとサーバーソケットチャネルがサポートされます。Unixドメインのソケットは、同一ホスト上でのプロセス間通信(IPC)に使用されます。ほとんどの点でTCP/IPソケットと似ていますが、IPアドレスやポート番号ではなく、ファイルシステムのパス名でアドレス指定される点が異なります。ローカルなプロセス間通信では、Unixドメインソケットは、TCP/IPループバック接続よりも安全で効率的です。

JEP 392 Packaging Tool

この機能は、Java 14でインキュベーター・モジュールとして初めて導入されました。

JEP 343: Packaging Tool (Incubator)
https://openjdk.java.net/jeps/343

このツールを使うと、自己完結型のJavaアプリケーションをパッケージ化できます。エンドユーザーが自然にインストールできるように、ネイティブ・パッケージ形式をサポートしており、Windowsではmsiやexe、macOSではpkgやdmg、Linuxではdebやrpmといった形式をサポートしています。また、パッケージ化の際に起動時のパラメータを指定することができ、コマンドラインから直接、またはToolProvider APIを使ってプログラム的に呼び出すことができます。なお、jpackageモジュールの名称が、jdk.incubator.jpackageからjdk.jpackageに変更されている点にご注意ください。これにより、アプリケーションインストール時のエンドユーザーの操作性が向上し、app storeモデルを使用したデプロイメントが簡素化されます。

4. Futureproofing Your Work

JEP 390 Warning for Value-Based Classes

この機能は、プリミティブ・ラッパー・クラス(Boxed Primitiveとも。java.lang.Integerjava.lang.Double など)を値ベース(java.util.Optionaljava.time.LocalDateTimeと同様)と指定し、JDK 9 以降で非推奨となっているそれらのコンストラクタに forRemoval を追加して、新たな警告を促します。 これは、Java Platformのあらゆる値ベースのクラスのインスタンス上で同期を取ろうとする不適切な試みについての警告です。

人気のあるオープンソース・プロジェクトの多くは、Java 9の廃止警告に対応して、ラッパー・コンストラクタの呼び出しをソースから削除しており、廃止警告(deprecated for removal)の緊急性が高まっていることから、さらに多くのプロジェクトが対応することが期待されます。

JEP 396 Strongly Encapsulate JDK Internals by default

この機能は、sun.misc.Unsafeなどの重要な内部 API を除き、デフォルトで JDK のすべての内部要素を強力にカプセル化します。以前のリリースで正常にコンパイルされたJDKの内部APIにアクセスするコードは、デフォルトでは動作しなくなる可能性があります。この変更は、開発者が内部APIではなく標準APIの使用に移行することを奨励し、開発者とユーザーが将来のJavaリリースに手間なくアップグレードできるようにすることを目的としています。この強力なカプセル化は、ランチャーオプションの--illegal-accessで制御できます。JDK 9からJDK 15まではデフォルトで警告(warning)、JDK 16からはデフォルトで拒否(deny)です。(今のところ)1つのコマンドラインオプションですべてのパッケージのカプセル化の解除がまだ可能ですが、将来的には、--add-opensで特定のパッケージだけを解除するようになるでしょう。

5. Incubator and Preview Features

JEP 338 Vector API (Incubator)

このインキュベータAPIは、ベクトル計算を表現するためのAPIの初期段階のものです。このAPIは、サポートされている CPU アーキテクチャ上の最適なベクターハードウェア命令に実行時に確実にコンパイルし、同等のスカラー計算よりも優れた性能を実現します。これにより、最新のCPUに搭載されているSIMD(Single Instruction Multiple Data)命令を利用できます。HotSpotは自動ベクトル化(auto-vectorization)をサポートしていますが、変換可能なスカラー演算のセットは限られており、コードの変更には脆弱です。このAPIを使うことで、開発者は移植性と性能に優れたベクトル・アルゴリズムをJavaで簡単に書くことができるようになります。

JEP 389 Foreign Linker API (Incubator)

このインキュベーターAPIは、静的型付けされたpure Javaのネイティブコードへのアクセスを提供します。このAPIは、ネイティブ・ライブラリへのバインディングという、複雑でエラーが発生しやすいプロセスを大幅に簡素化します。Javaは、Java 1.1以降、Java Native Interface (JNI)を使うネイティブ・メソッド・コールをサポートしてきましたが、難しくて不安定だったりします。(これを使えば)Javaの開発者は、特定のタスクに有用だと思われるネイティブ・ライブラリを(ほとんど)利用できるはずです。また、JNIのグルーコード(glue code)を使わずに外部関数のサポートを提供します。

JEP 393 Foreign Memory Access API (3rd Incubator)

Java 14、15でインキュベーターAPIとして導入されたこのAPIは、Javaプログラムがさまざまな種類の外部メモリ(ネイティブ・メモリ、パーシステント・メモリ、マネージド・ヒープ・メモリなど)を安全かつ効率的に操作できるようにするものです。また、Foreign Linker APIの基礎となっています。

JEP 397 Sealed Classes (2nd Preview)

このプレビュー機能は、他のクラスやインターフェイスがクラスを拡張または実装することを制限するものです。これにより、クラスやインターフェイスの作者が、どのコードがそれを実装する責任があるかを制御できます。また、スーパークラスの使用を制限するために、アクセス修飾子よりも宣言的な方法を提供しています。そして、パターンの網羅的な分析を下支えすることで、パターンマッチングの将来の方向性をサポートします。

6. Improving Productivity for OpenJDK Developers

残りの変更点は、Java開発者(Javaを使用してアプリケーションをコーディングおよび実行する人)には直接関係なく、Javaの開発者(OpenJDKに関わっている人)に関係するものです。

JEP 347 Enable C++14 Language Features (in JDK source code)

これにより、JDKのC++ソースコードでC++14の言語機能を使用できるようになり、HotSpotのコードでどの機能を使用できるかについての具体的な指針が示されました。JDK 15 までは、JDK の C++ コードで使用される言語機能は C++98/03 の言語標準に限定されていました。これにより、様々なプラットフォームのコンパイラの最小許容バージョンを更新する必要があります。

JEP 357 Migrate from Mercurial to Git
JEP 369 Migrate to GitHub

これらの JEP は、JDK 11 およびそれ以後のコードについて、OpenJDK コミュニティのソース・コード・リポジトリを Mercurial (hg) から Git に移行し、GitHub にホストするものです。この移行には、jcheckwebrevdefpathといったツールのGit向けアップデートも含まれます。Gitはメタデータのサイズを縮小(約1/4)するので、ローカルディスクのスペースを確保し、クローン作業の時間を短縮します。最新のツールだと、MercurialよりもGitとの統合が進んでいます。OpenJDK の Git リポジトリは以下からどうぞ。

OpenJDK
https://github.com/openjdk

JEP 386 Alpine Linux Port
JEP 388 Windows/AArch64 Port

これらのJEPは、移植作業そのものではなく、それらをJDKのメインライン・リポジトリに統合することが目的です。

JEP 386は、Alpine Linuxや、x64とAArch64の両方でMuslを主要なCライブラリとして使用している他のディストリビューションに JDK を移植しています。またJEP 388では、JDKをWindows AArch 64 (ARM64)に移植しています。

Tooling Support

現在のツールによるサポートは、開発者の生産性向上に貢献していますが、Java 16でも引き続き、現在のJavaバージョンをサポートするツール・ソリューションを提供している主要なIDEベンダーの努力を引き続き歓迎しております。 開発者は、以下のIDEでJava 16のサポートを受けることができます。

Javaは、ソフトウェア・プログラマーが選択するプログラミング言語の第1位であり続けています。 Java 16による改善が予定通りに行われたことからもわかるように、熟考を重ねた計画とエコシステムへの関与を継続することで、Javaプラットフォームは、最新の開発とクラウドでの成長に向けて十分な体制を整えています。

引き続き、以下の方法でニュースや最新情報を入手してください。

  • Inside.Java
    OracleのJavaチームからのニュースや見解をご覧ください。
  • Inside.JavaのPodcast
    Java開発者向けのPodcastで、OracleでJavaを作っている人たちが直接お届けします。言語、JVM、OpenJDK、プラットフォームのセキュリティ、LoomやPanamaなどのイノベーション・プロジェクト、その他あらゆることについて議論します。
  • OpenJDKメーリングリスト
    お気に入りのOpenJDKプロジェクトの進捗状況を知ることができます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中