概要

Javaの最新版となるJDK 27が9月15日、正式にリリースされた。半年サイクルの非LTS(長期サポート対象外)版で、8月に公開されたリリース候補版から機能セットが確定した形となる。今回のリリースにはJSR 402に基づき、ガベージコレクションやTLS通信、並行処理、JVM運用ツールに関わる合計9件のJEP(JDK Enhancement Proposal)が盛り込まれた。GA版のバイナリはGPLライセンスの下で提供されている。

GCとセキュリティ関連の主要な変更

最も影響が大きい変更の一つが、JEP 523によるG1ガベージコレクタの全環境デフォルト化だ。これまでメモリやCPUリソースが限られた環境ではSerial GCが既定として使われてきたが、G1が一貫して優れたパフォーマンスを示してきたことを受け、環境を問わずG1が標準となる。ただし記事では「唯一絶対のベストなGCは存在しない」とも指摘されており、ワークロードに応じたGCの選定・検証は引き続き推奨されている。JDK 25で正式機能(オプトイン)として導入されていたコンパクトオブジェクトヘッダーも、JEP 534によりデフォルトで有効化された。オブジェクトのメタデータサイズを縮小することで、ヒープ使用量を約20%削減し、GCの負荷軽減にもつながるという。無効化する場合は-XX:-UseCompactObjectHeadersオプションを指定する。

セキュリティ面では、JEP 527によりTLS 1.3向けのポスト量子ハイブリッド鍵交換が正式機能として導入された。将来の量子コンピュータによる暗号解読リスクに備え、従来の鍵交換方式と耐量子アルゴリズムを組み合わせる仕組みで、通信の長期的な機密性を高める狙いがある。また、JEP 536「JFR In-Process Data Redaction」により、Java Flight Recorderがプロファイリング時にJVM引数や環境変数からパスワードやAPIキーなどの機密情報を自動的に秘匿化するようになった。*password*や*token*、*private*key*といったパターンがデフォルトで除外対象となり、-XX:FlightRecorderOptionsを通じてグロブパターンによるカスタムフィルタも設定できる。

プレビュー機能とツールの変更

正式機能化されたJEPに加え、プレビュー・インキュベーション段階の機能も引き続き磨き込まれている。構造化並行性(JEP 533)は第7弾のプレビューを迎え、プリミティブ型のパターンマッチング(JEP 532)は第5弾、Lazy Constants(JEP 531)とPEMエンコーディング対応(JEP 538)はそれぞれ第3弾のプレビューとなった。Vector APIも第12弾のインキュベーションとして提供が続く。

運用ツール面では、jcmdがbash補完スクリプト(<JDK_HOME>/conf/bash-completion/jcmd)に対応したほか、ランタイムのセキュリティ設定を表示する新コマンドVM.security_propertiesが追加された。VM.infoやhs_errログではオープンなファイルディスクリプタ数も報告されるようになっている。一方で、-noclassgcや-noverify、-Xverify:noneといった旧来のオプションは削除され、-XX:InitiatingHeapOccupancyPercentはG1専用の-XX:G1IHOPに改称された。-XX:UseCompressedClassPointersも常時有効化されたことで指定が不要になるなど、長年蓄積してきたレガシーオプションの整理が進んだ形だ。JVMCIモジュールも完全に削除されている。

非LTS版であるJDK 27は次期LTS版へ向けた機能の試金石という側面も持つ。G1GCの全面デフォルト化やポスト量子暗号対応といった今回の変更は、次のLTSリリースにそのまま引き継がれる可能性が高く、今後のJavaプラットフォームの方向性を占ううえでも注目される内容となっている。