JDK 12:Java12の新機能

Java SE(Standard Edition)12に基づくJava Development Kit12の製品リリースが利用可能になりました。JDK 12ビルドは、Oracle for Linux、Windows、およびMacOSから入手できます。 

JDK12をダウンロードする場所

JDK 12は、Java.netWebサイトからダウンロードできます。

オープンソースビルドは、クラスパス例外を除いて、GNU General Public Licensev2の下で提供されます。OracleのJDK12の商用ビルドは、非オープンソースライセンスの下でOracleTechnologyネットワークにあります。

Java12の新機能

シェナンドアガベージコレクター

Java 12は、実験的なガベージコレクションアルゴリズムであるShenandoahを追加して、Javaスレッドの実行と同時に避難作業を実行することにより、ガベージコレクションの一時停止時間を短縮します。Shenandoahは、応答性と予測可能な短い一時停止を重視するアプリケーションに適切なアルゴリズムを提供します。ただし、JVMの一時停止の問題をすべて修正することは目的ではありません。

Red Hatは現在、Aarch64およびAMD64アーキテクチャでShenandoahをサポートしています。

G1ガベージコレクター用の中止可能な混合コレクション

Java 12は、G1混合コレクションが一時停止ターゲットを超える可能性がある場合、それらを中止可能にします。G1の目標は、収集の一時停止について、ユーザーが指定した一時停止時間の目標を達成することでした。

以前は、高度な分析エンジンが収集中に実行する作業の量を選択していました。その結果、コレクションセットと呼ばれる領域のセットが作成されました。セットが決定され、収集が開始されると、G1は、すべての領域のコレクションの領域にあるすべてのライブオブジェクトを停止せずに収集しました。ただし、アプリケーションのヒューリスティックが大きすぎるコレクションセットを選択した場合、これによりG1が一時停止時間の目標を超える可能性があります。

ヒューリスティックがコレクションに対して誤った量の作業を繰り返し選択したことを検出し、これが発生した場合は、G1に段階的に収集作業を実行させ、各ステップの後に収集を中止できるメカニズムが必要でした。Java 12で導入されたメカニズムにより、G1は一時停止時間の目標をより頻繁に達成できます。

未使用のコミットされたメモリの迅速な返却

Java 12は、G1を拡張して、アイドル時にJavaヒープメモリをオペレーティングシステムに自動的に返します。このメモリは、アプリケーションアクティビティが非常に少ない場合に、妥当な期間に解放されます。

以前は、G1は、完全なガベージコレクションまたは並行サイクル中にのみヒープからメモリを返していました。G1は完全なガベージコレクションを回避しようとし、ヒープの占有と割り当てアクティビティに基づいて同時サイクルをトリガーするだけなので、外部から強制されない限り、多くの場合、ヒープメモリを返しません。この動作は、リソースが使用によって支払われるコンテナ環境では不利でした。非アクティブのためにJVMが割り当てられたメモリの一部のみを使用する場合でも、G1は完全なヒープを保持しました。そのため、顧客は常にすべてのリソースにお金を払っており、クラウドプロバイダーはハードウェアを十分に活用できませんでした。

Java 12を使用すると、JVMはヒープの使用率が低いフェーズを検出し、その間にヒープの使用量を自動的に減らすことができます。 

JVM定数API

このAPIは、キークラスファイルとランタイムアーティファクト、特に定数プールからロード可能な定数の名目上の記述をモデル化します。Java 12は、新しいパッケージで値ベースのシンボリック参照型のファミリーを定義し、java.lang.invoke.constantロード可能な定数の種類ごとに記述します。

定数プールはすべてのJavaクラスに存在し、クラスにオペランドとバイトコード命令を格納します。定数プールのエントリは、クラスやメソッドなどのランタイムアーティファクト、または文字列や整数などの単純な値のいずれかを記述します。これらのエントリは、ロード可能な定数と呼ばれます。

クラスファイルを操作するプログラムは、バイトコード命令をモデル化し、次にロード可能な定数をモデル化する必要があります。ただし、標準のJavaタイプを使用してロード可能な定数をモデル化することは不十分です。これは、文字列を記述するロード可能な定数では許容できる場合がありますが、「ライブ」Classオブジェクトの生成はクラスのロードの正確性と一貫性に依存するため、クラスを記述するロード可能な定数では問題があります。ただし、クラスのロードには、多くの環境依存関係と障害モードがあります。

したがって、ロード可能な定数を処理するプログラムは、クラスやメソッド、およびメソッドハンドルや動的に計算された定数など、あまり知られていないアーティファクトを名目上の記号形式で操作できれば、簡略化できます。したがって、JVM定数APIは、ライブラリとツールに、ロード可能な定数を記述するための単一の標準的な方法を提供します。

スタートアップ、CDS、ガベージコレクションの改善

Java 12は、JDKビルドプロセスを拡張して、64ビットプラットフォームでデフォルトのクラスリストを使用して、デフォルトのクラスデータ共有(CDS)アーカイブを生成します。これにより、すぐに使用できる起動時間が改善され-Xshare:dump、CDSを利用するために実行する必要がなくなります。JDKビルドプロセスはjava-xshare:dump、イメージをリンクした後に実行されるように変更されました。

ガベージコレクションのヒープ時間を微調整して、一般的なケースのメモリレイアウトを改善するために、追加のコマンドラインオプションが含まれています。アプリケーションクラスやさまざまなガベージコレクション構成を含むカスタムクラスリストなど、より高度な要件を持つユーザーは、引き続きカスタムCDSアーカイブを作成できます。

ARMポートの数の削減

Java 12はarm64、32ビットのARMと64ビットを保持しながら、ポートに関連するすべてのソースを削除しますaarch64。このポートを削除すると、寄稿者は単一の64ビットARM実装に注力し、2つのポートを維持することで生じる重複作業を排除できます。現在、2つの64ビットARMポートがJDKにあります。

式を切り替えます

Switch式は、switchステートメントを拡張してコーディングを簡素化し、ステートメントまたは式として使用できるようにします。これにより、ステートメントと式の両方で「従来の」または「簡略化された」スコープを使用し、フローの動作を制御できます。これらの変更により、「日常」のコーディングが簡素化され、でパターンマッチングを使用する方法が準備されswitchます。

Javaビルダーがパターンマッチングのサポートに移行するにつれて、Javaswitchステートメントの不規則 性が障害になっています。これらには、スイッチブロックのデフォルトの制御フロー動作が含まれます。スイッチブロックのデフォルトのスコープ。ブロックは単一のスコープとして扱われます。とスイッチはステートメントとしてのみ機能します。Javaのswitchステートメントの現在の設計は、C ++などの言語に厳密に従っており、デフォルトでフォールスルーセマンティクスをサポートしています。この制御フローは、低レベルのコードを作成するのに役立ちました。ただし、スイッチを高レベルのコンテキストで使用すると、エラーが発生しやすい性質が柔軟性を上回り始めます。

基本的なベンチマークスイート

JDK 12には、プラットフォームのソースコードに追加されたマイクロベンチマークの基本スイートが含まれています。目標は、開発者が既存のベンチマークを実行したり、新しいベンチマークを構築したりするのを容易にすることです。

2014年7月に作成され、2018年11月初旬に更新されたマイクロベンチマークスイートの提案は、Javaおよびその他のJVM言語で記述されたベンチマークを構築するためのJava Microbenchmark Harness(JMH)によって支えられました。このスイートは、JDKソースコードと同じディレクトリに配置されており、開発者は新しいベンチマークを簡単に追加できます。

新しいJDK機能のベンチマークを提供したり、JDKのすべてをカバーするベンチマークの完全なセットを作成したりすることは目標ではありませんでした。また、ベンチマークスイートは通常のJDKビルドには必要ありませんが、別個のビルドターゲットであることに注意してください。 

この提案では、ベンチマークの開発方法と要件の説明を説明するために、wiki.openjdk.java.netに新しいページを作成することが求められました。これらの要件は、コーディング標準、再現可能なパフォーマンス、およびドキュメントの順守を義務付けます。

JDK12の更新

計画では、JDK12が2つの更新を受信して​​から6か月でJDK13に成功することを求めています。JDK 12は、2017年9月にJDK9で導入されたOracleの6か月のリリースリズムの一部です。JDK12は、数年間のサポートが計画されている長期サポートリリースであるJDK 11とは異なり、機能リリースとして特徴付けられます。