Java16が正式にリリースされ、新機能が完全に分析されます

この記事はInfoQから複製されています。3月16日、Oracleは Java16を正式にリリースしました。Oracleによると、Java16はすべての開発者と企業が利用できるようになりました。

Oracle Critical Patch Update(CPU)スケジュールに従って、Oracle JDK16は少なくとも2つの四半期ごとの更新を受信すると報告されています。その後、Oracle JDK17がリリースされました。Java 17は2021年9月に正式にリリースされますが、jdk.java.netはすでに早期アクセスバージョンを提供しています。

6か月のリリースサイクルに移行した後、Java16はOracleによってリリースされた7番目の機能バージョンです。オラクルによると、「6か月のリリースサイクルにより、本番環境で使用できるイノベーションの配信速度が大幅に向上しました。」

Java 16は合計1,897の問題を修正し、そのうち1,397はOracleスタッフによって完了され、500は個々の開発者と、ARM、SAP、RedHat、Tencent、Microsoft、Intel、Huawei、など。Ampere Computing、Bellsoft、DataDog、Microdoc、独立した開発者など、一部の小規模な組織もJava 16の修正の3%を提供しました。

画像

Oracleは、「GPLv2とClasspath Exceptionを再利用して、Java 16をOracleのOpenJDKバージョンとして提供し、OracleのJDKバージョンをOracleの製品またはサービスの一部として使用するユーザー、または商用サポートを希望するユーザーに商用ライセンスを提供します」と述べています。

1Java16の新機能

何千ものパフォーマンス、安定性、セキュリティの更新を備えたJava 16は、3つのインキュベーターモジュールとプレビュー機能を含む、17の主要な拡張/変更(JDK拡張提案-JEPと呼ばれる)をユーザーに提供します。

Incubator Moduleには、非最終APIと非最終ツールを開発者に渡す方法であるいくつかの拡張機能が導入されています。この方法により、ユーザーはフィードバックを提供してJavaプラットフォームの品質を向上させることができます。

同様に、一部の拡張機能は、Java SEプラットフォームのプレビュー機能、言語、またはVM機能として導入されています。これらの拡張機能は、完全に指定され、完全に実装されていますが、永続的ではありません。これらの拡張機能はJDK機能バージョンで提供され、開発者が実際の使用法に基づいてフィードバックを提供することを奨励します。これにより、将来のバージョンで永続的に保持される可能性があります。これにより、ユーザーはタイムリーなフィードバックを得る機会が得られ、ツールベンダーは、本番環境でこの機能を使用する前に、多数のJava開発者をサポートする機会が得られます。

Java 16に付属する17のJEPは、6つの異なるカテゴリに分類されます。

新しい言語機能

JEP 394、instanceofのパターンマッチング

プレビュー機能としてのマッチングパターン(パターンマッチング)は、Java 14、15またはJavaのプレビュー機能で最初に導入されました。パターンマッチングは、instacneof演算子のパターンマッチングによってJavaプログラミング言語を強化します。

パターンマッチングにより、プログラムの一般的なロジック(つまり、オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に行うことができます。

JEP 395、記録

レコードは、Java14およびJava15のプレビュー機能として導入されました。浅い不変データの透過的なホルダーであるクラスを宣言するためのコンパクトな構文を提供します。これにより、これらのクラスが大幅に簡素化され、コードの可読性と保守性が向上します。

JVMの改善

JEP 376、ZGC並行スレッド処理

JEP 376は、ZGCスレッドスタック処理をセーフポイントから並行フェーズに転送し、大きなヒープでも、GCセーフポイントを数ミリ秒以内に一時停止できるようにします。ZGCガベージコレクターの最後のレイテンシーの原因を排除すると、アプリケーションのパフォーマンスと効率を大幅に向上させることができます。

JEP 387、弾性要素空間

この機能により、未使用のHotSpotメタデータ(メタスペース)メモリをオペレーティングシステムにすばやく戻すことができるため、メタスペースが占めるスペースを削減できます。クラスのロードおよびアンロードアクティビティが多いアプリケーションは、未使用のスペースを大量に消費する可能性があります。新しいスキームは、メタスペースメモリをより小さなブロックに割り当て、未使用のメタスペースメモリをオペレーティングシステムに返して柔軟性を高め、それによってアプリケーションのパフォーマンスを向上させ、メモリ使用量を削減します。

新しいツールとライブラリ

JEP 380、Unix-ドメインソケットチャネル

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

JEP 392、パッケージングツール

この機能は、Java 14のインキュベーターモジュールとして最初に導入されました。これにより、自己完結型のJavaアプリケーションのパッケージ化が可能になります。エンドユーザーに自然なインストールエクスペリエンスを提供するネイティブパッケージ形式をサポートしています。これらの形式には、Windowsのmsiとexe、macOSのpkgとdmg、Linuxのdebとrpmが含まれます。また、パッケージ化時に起動パラメーターを指定することもでき、コマンドラインから直接呼び出すことも、ToolProviderAPIを介してプログラムで呼び出すこともできます。jpackageモジュールの名前がjdk.incubator.jpackageからjdk.jpackageに変更されていることに注意してください。これにより、アプリケーションをインストールする際のエンドユーザーのエクスペリエンスが向上し、「アプリストア」モデルの展開が簡素化されます。

将来に備える

JEP 390、値ベースのクラスについて警告

この機能は、元のラッパークラス(java.lang.Integer、java.lang.Doubleなど)を値ベース(java.util.Optionalおよびjava.time.LocalDateTimeと同様)として指定し、そのコンストラクターにforRemovalを追加します(以降JDK 9は非推奨になりました)、これにより新しい警告が表示されます。Javaプラットフォームの値ベースのクラスのインスタンスで誤って同期しようとすると、警告が発行されます。

多くの人気のあるオープンソースプロジェクトは、Java 9の非推奨警告に応じて、ソース内のラッパーコンストラクター呼び出しを削除しました。「非推奨の削除」警告の緊急性を考えると、より多くのオープンソースプロジェクトがこのペースに追いつくことが期待できます。

JEP 396、デフォルトでJDK内部要素の強力なカプセル化

この機能は、主要な内部API(sun.misc.Unsafeなど)を除いて、デフォルトでJDKのすべての内部要素を強力にカプセル化します。デフォルトでは、JDKの内部APIにアクセスするために以前のバージョンで正常にコンパイルされたコードは機能しなくなる可能性があります。開発者は、内部要素の使用から標準のAPIメソッドの使用に移行して、開発者とそのユーザーが将来のJavaバージョンにシームレスにアップグレードできるようにすることをお勧めします。強力なカプセル化は、JDK 9ランチャーオプション–illegal-accessによって制御されます。JDK15では、デフォルトで警告に変更され、JDK16からはデフォルトで拒否されます。(現在)単一のコマンドラインオプションですべてのパッケージのパッケージ化を緩和することは引き続き可能であり、将来的には-add-opensのみを使用して特定のパッケージを開きます。

インキュベーターとプレビュー機能

JEP 338、Vector API(インキュベーター)

インキュベーターAPIは、いくつかのベクトル計算を表現するためのAPIの初期反復を提供します。これらの計算は、同等のスカラー計算よりも優れたパフォーマンスを取得し、最大限に活用するために、実行時にサポートされているCPUアーキテクチャーで最高のベクトルハードウェア命令に確実にコンパイルされます。シングルインストラクションマルチデータ(SIMD)テクノロジー(最新のCPUで利用可能なインストラクション)。HotSpotは自動ベクトル化をサポートしていますが、変換可能なスカラー演算のセットは制限されており、コードが変更される可能性があります。このAPIを使用すると、開発者はJavaでポータブルで高性能なベクターアルゴリズムを簡単に作成できます。

JEP 389、外部リンカーAPI(インキュベーター)

インキュベーターAPIは、静的型付けとネイティブコードへの純粋なJavaアクセスを提供します。APIは、ネイティブライブラリをバインドする元々複雑でエラーが発生しやすいプロセスを大幅に簡素化します。Java 1.1は、Java Native Interface(JNI)を介したネイティブメソッドの呼び出しをすでにサポートしていますが、使用するのは簡単ではありません。Java開発者は、特定のタスクのために特定のネイティブライブラリをバインドできる必要があります。また、中間のJNIグルーコードなしで外部関数をサポートします。

JEP 393、外部メモリアクセスAPI(3番目のインキュベーター)

このAPIは、Java14およびJava15でインキュベーターAPIとして導入され、Javaプログラムがさまざまな外部ストレージ(ネイティブストレージ、永続ストレージ、マネージドヒープストレージなど)で安全かつ効果的に動作できるようにします。これは、外部リンカーAPIの基礎を提供します。

JEP 397、封印されたカテゴリ(2番目のプレビュー)

このプレビュー機能は、どのクラスまたはインターフェースがそれらを拡張または実装できるかを制限できます。クラスまたはインターフェースの作成者が、それを実装するコードを制御できるようにします。また、アクセス修飾子よりも宣言的な方法を提供して、スーパークラスの使用を制限します。また、パターンの詳細な分析を通じて、パターンマッチングの将来の開発をサポートします。

OpenJDK開発者の生産性を向上させる

残りの変更は、Java開発者(Javaでコードを記述してアプリケーションを実行する人)には直接表示されませんが、Java開発者(OpenJDK開発に関係する人)にのみ表示されます。

JEP 347、C ++ 14言語機能の有効化(JDKソースコード内)

これにより、JDK C ++ソースコードでC ++ 14言語機能を使用できるようになり、HotSpotコードで使用できる機能に関する具体的なガイダンスが提供されます。JDK 15では、JDKのC ++コードで使用される言語機能はC ++ 98/03言語標準に制限されています。さまざまなプラットフォームコンパイラの最小許容バージョンを更新する必要があります

JEP 357、MercurialからGitに移行; JEP 369、GitHubに移行

これらのJEPは、OpenJDKコミュニティのソースコードリポジトリをMercurial(hg)からGitに移行し、JDK 11以降で使用するためにGitHubでホストしました。これには、jcheck、webrev、defpathツールなどのツールのGitへの更新が含まれます。Gitはメタデータのサイズを縮小し(約1/4)、ローカルディスクスペースを節約し、クローン作成時間を短縮できます。Mercurialと比較して、最新のツールチェーンはGitとより適切に統合できます。

Open JDKGitリポジトリは現在https://github.com/openjdkにあります。

JEP 386、AlpineLinuxポート、JEP 388、Windows / AArch64ポート

これらのJEPの焦点は、移植自体ではなく、JDKメインラインリポジトリに統合することです。JEP386は、x64のメインCライブラリとしてmuslを使用するAlpineLinuxおよびその他のディストリビューションにJDKを移植しました。さらに、JEP388はJDKをWindowsAArch64(ARM64)に移植しました。

2ツールチェーンのサポート

ツールチェーンは、開発者の生産性を向上させるのに役立ちます。現在、Java 16をサポートするIDEには、JetBrainsIDEAとEclipseIDEが含まれています。

オラクルは、「ツールチェーンソリューションが開発者に現在のJavaバージョンのサポートを提供している主要なIDEベンダーの努力を引き続き歓迎します」と述べています。

最後に書かれた3:

昨年、Javaは25周年を迎えました。IDCの最新レポート「JavaTurns25」によると、900万人以上の開発者(世界中のフルタイム開発者の69%)がJavaを使用しています。これは他のどの言語よりも多いです。プラットフォームのパフォーマンス、安定性、セキュリティを継続的に改善する能力に依存しているJavaは、開発者の間で常に最も人気のあるプログラミング言語であり、「宇宙の最初の言語」として知られています。

オラクルはブログ投稿に次のように書いています。

20年以上の継続的なイノベーションの後、Javaは変化する技術環境に適応し、プラットフォームの独立性を維持しながら柔軟性を維持し、下位互換性を維持することで信頼性を確保し、セキュリティを犠牲にすることなく加速します。

おすすめ

転載: blog.csdn.net/weixin_39787242/article/details/114977845