テクノロジー

Java 27、アプリをフリーズさせるGCを廃止しオブジェクトメモリを 33% 削減

Adrian Kessler
Googleで追加する

Java 27には、実行中のあらゆるJVMに静かに行き渡る2つの変更が搭載されている。G1ガベージコレクタがすべてのJavaランタイムでデフォルトとなり、リソース制約のあるハードウェア上で長らく続いてきたストップ・ザ・ワールド型のSerialコレクタの居場所がついに終わりを告げる。また、オブジェクトヘッダーが96ビットから64ビットに縮小され、大量のオブジェクトを生成するあらゆるアプリケーションでオーバーヘッドが3分の1削減される。

SerialコレクタはJava最古のGCであり、シンプルで予測可能、そして過酷なものだった。これが実行されると、ヒープがクリーンアップされるまでアプリケーション全体が停止した。大容量メモリ・マルチCPUサーバーでは、そのトレードオフは数年前にすでに維持不可能となり、Java 9以降、G1がサーバーのデフォルトとしてSerialに取って代わった。しかし、シングルCPUマシン、小規模なクラウドVM、低メモリの組み込みシステムといったリソース制約のある環境では、Java 26までSerialがデフォルトとして使われ続けていた。そのデフォルト設定がJava 27で終了する。

G1はヒープを小さなリージョンに分割し、段階的にコレクションを実行する。最もガベージが多いセクションを優先するため、Garbage-First(ガベージファースト)と呼ばれる。一時停止は依然として発生するが、Serialのフルコレクションに比べて短く、予測可能性が高い。Oracleは、G1がすべてのヒープサイズでSerialと競合するようになったと述べている。最も安価なクラウドインスタンス(CPU1基、RAM 1GB)にアプリケーションをデプロイする開発者にとって、Java 27は長年抱えてきた摩擦を取り除くことになる。

コンパクトオブジェクトヘッダーの変更は、今回のリリースのもう一つの柱である。Javaオブジェクトは、型情報、ハッシュコード、ロック状態といったメタデータを保持しており、これらはすべてのオブジェクトに付随するヘッダーに格納される。従来のフォーマットは96ビットを使用していた。Java 27ではこれを64ビットに圧縮し、オブジェクトあたり33%の削減となる。メッセージキュー、金融台帳、イベント駆動型マイクロサービスなど、数百万のオブジェクトを生成するアプリケーションでは、累積効果は顕著である。ヒープの密度が高まり、CPUキャッシュの利用効率が向上し、必要なコレクションサイクルが減少する。

どちらの変更にも注意点がある。Serial GCの動作に明示的にチューニングされたアプリケーションは、アップグレード後に予期しないタイミングの違いが生じる可能性がある。G1はSerialよりもブックキーピングに多くのメモリを使用するため、メモリ予算が極めて厳しい環境では影響が生じる。ただし、Oracleのテストによれば、ほとんどのワークロードではスループットのトレードオフは無視できる程度である。Java 27をリソース制約のあるシステムに導入する開発チームは、出荷前に新しいデフォルト設定に対してテストを行うべきである。移行は自動的に行われるが、目に見えないわけではない。

Java 27はまた、TLS 1.3向けのポスト量子ハイブリッド鍵交換を追加し、既存のX25519楕円曲線鍵交換に加えてML-KEMアルゴリズムを実装している。今日ネゴシエートされたTLS接続は、理論上、将来の量子コンピュータによってキャプチャされ、後日復号される可能性がある。ハイブリッド鍵交換は、攻撃者に古典アルゴリズムとポスト量子アルゴリズムの両方を同時に破らせることで、その脅威に対抗する。これは、機密データを扱うあらゆるJavaサービスにとって有意義な追加機能である。

Java 27は、プラットフォームの6カ月周期に従い、2026年9月15日にリリースされた。構造化並行性と遅延定数は、今回のバージョンでも引き続きプレビュー機能として提供される。Javaシリーズにおける次回の長期サポートリリースは2027年に予定されている。

タグ: , , , , ,

Googleで追加する

ディスカッション

0件のコメントがあります。