最新の機能リリースであるJava 12が3月19日,予定どおりリリースされた。この新リリースには,注目すべき機能や改良が多数含まれている。具体的には,Switch式(プレビュー機能)と呼ばれる新たな言語機能,Shenandoahという停止時間の少ないガベージコレクション(実験的機能),デフォルトG1ガベージコレクションの改善などだ。
Oracleの新たな命名体系と頻繁なリリースサイクルに従った今回のバージョンは,Java 11からちょうど6ヶ月でリリースされた。長期サポート(TLS)リリースではないため,サポート期間は6ヶ月間となる。
スイッチ式
スイッチ式は,既存のスイッチ文に改良を加えた,新たな言語機能である。複数の条件を表現する場合には,これまでよりも簡潔で冗長性の少ない記述が可能になる。スイッチ式は,新たに導入された構文を使用して記述する。
int value = switch (number) { case ONE -> 1; case TWO -> 2; case THREE -> 3; };
コロン(:)の代わりに矢印(->
)が使用されていること,break
文がないことに注目してほしい。スイッチ式にはフォールスルー(fall through)構文は存在せず,各ラベルが値を生成しなければならない。テストされる変数の取り得る値ぞれぞれに,スイッチ内のブランチが対応する必要がある。
このような事実のため,スイッチ式ではdefault
ラベルが必要になる。ただし,スイッチ式で列挙型を使用する場合には,取り得る値をブランチですべてカバーすれば,defaultラベルを省略できる。スイッチ式の詳細については,先日のInfoQの記事でも紹介している。
注意すべき点として,スイッチ式はJava 12でもプレビュー機能の扱いであるため,プログラムで使用する場合には,コマンド行スイッチとして"--enable-preview
"をjavac
コンパイラに渡す必要がある。
新ガベージコレクタ: Shenandoah
Java 12には,"停止時間の短いガベージコレクタ"を目標とした,新たなガベージコレクタであるShenandoahが含まれている。このガベージコレクタは,ガベージコレクタとしての責務(退避,マーキング,圧縮など)を,Javaプログラム内のアプリケーションスレッドとより並列的に動作することによって機能する。これによって並列実行されない他の処理が少なくなり,結果として停止時間が短縮されるはずだ。
応答性や一時停止の予測性を必要とするアプリケーションは,Shenandoahの優れた利用候補になる。Shenandoahを寄贈したRed Hatの目標が,"Shenandoahの停止時間がヒープサイズに左右されないこと,つまり,ヒープが200MBでも200GBでも,停止時間は一貫して同じであること",というのも特筆に値する。ただし,現実のパフォーマンスは,ヒープサイズやワークロードによって影響を受ける。
Shenandoahは現時点では試験的プロジェクトに位置付けられており,有効にするにはオプション"-XX:+UnlockExperimentalVMOptions
" を指定する必要がある。Red Hatはその初期実装者として名を連ねており,aarch64アーキテクチャとamd64アーキテクチャの両方を引き続きサポートする予定である。
既存のガベージコレクションの改善
Java 12では新しいガベージコレクタが付属するだけでなく,既存のG1ガベージコレクタの改良も行われており,拡張提案JEP 344とJEP 346の両方がリリースに含まれている。
前者のJEP 344は,G1ガベージコレクタがコレクション停止時間の目標を達成する方法を改善するものだ。この提案では,G!ガベージコレクタが,定義された停止時間内に処理できない作業量を(アプリケーションヒューリスティックによって)誤って選択した場合の問題を解決する。このようなケースでは,停止時間の目標を超過することは避けられない。
これを改善するため,新たなG1ガベージコレクタでは,不正な作業量を何度も選択したことを検出して,調整することが可能になった。これは,処理を必須のものと省略可能なものの集合に分類することによって実現される。省略可能な処理を実行している間は,いつでも処理を中止することが可能という判断だ。
2つめの改善点であるJEP 346は,G1ガベージコレクションが動作していない時に,使用しないJavaヒープメモリをオペレーティングシステム(OS)に返却することによって,メモリ使用量を改善するものだ。
この改善の前は,G1コレクタがJavaヒープメモリをOSに返すのはフルガベージコレクションの実行中のみであったため,ほとんどな行われることはなかった。これを実現するためにG1コレクタは,これまでよりもアイドル時間をより有効に使用して,未使用のJavaヒープメモリをOSに返すように改善されている。
その他の機能強化
上記2つの機能に加えて,Java 12リリースには他に6つの機能拡張が含まれている。
- JEP 230 – マイクロベンチマーク・スイート
- JEP 334 – JVM定数API
- JEP 340 – 2つあったAArch64ポートをひとつに
- JEP 341 – デフォルトCDSアーカイブ
- JEP 344 – G1の中止可能な混合コレクション
- JEP 346 – 未使用のコミットメモリのG1からの速やかな返却
現在はOracle JDK 12ビルドとOracle OpenJDK 12が入手可能で,他のプロバイダからも間もなく提供される見込みだ。