Java開発者Thomas Schatzl氏が8月4日に投稿した文書によると、OpenJDKは、最新バージョン「JDK 21」において、ガベージコレクションに関して大きな変更が行われる。
Generational ZGCの導入
Generational ZGCは、JDK 21に導入された新しいガベージコレクターである。これは、Z Garbage Collector(※)の進化版であり、主に若い世代(young generation)と古い世代(old generation)のオブジェクトを効率的に管理することを目的としている。Generational ZGCは、ガベージの発生が高い領域に注力し、JavaヒープとCPUの使用量を削減することで、アプリケーションのパフォーマンスを向上させる。また、Generational ZGCを有効にするための設定は、「-XX:+UseZGC」と「-XX:+ZGenerational」というフラグを使用する。
※Z Garbage Collector(ZGC): Java仮想マシン(JVM)におけるガベージコレクターの一つ。ZGCは、主に大規模かつリアルタイムなアプリケーションに向いており、低い停止時間、数百ギガバイトを超える大容量ヒープのサポート、逐次コンパクション(逐次的にヒープ内のオブジェクトをコンパクト化し、フラグメンテーションを最小限に抑え、ヒープの効率的な利用を可能にする仕組み)などの特徴を備える。
G1 GCの変更点
G1 GC(Garbage-First Garbage Collector)は、Java仮想マシン(JVM)におけるガベージコレクターの一つである。G1 GCは、ヒープ全体を複数のリージョン(regions)に分割し、各リージョンを若い世代と古い世代のように使い分けることで、効率的なガベージコレクションを実現する。G1 GCは、アプリケーションの応答性を向上させることを目指し、頻繁なフルガベージコレクションを回避するよう設計されている。
JDK 21におけるG1 GCの変更点には以下が含まれている。
フルGC中の動作改善: G1 GCは、フルGCの際に巨大なオブジェクトを移動させることで、領域レベルの断片化によるOutOfMemoryエラーのリスクを低減する変更が行われた。これにより、フルコレクション中にOutOfMemoryエラーが発生する可能性が減少し、アプリケーションの安定性が向上する。
ヒープのコンパクション改善: G1 GCは、フルコレクション後のヒープコンパクションに関する改善も行われている。これにより、フルコレクション後におけるヒープの断片化が軽減され、アプリケーションのパフォーマンスが向上する可能性がある。
"Hot Card Cache"の削除: 以前のバージョンで存在した「Hot Card Cache」というデータ構造が削除された。これは、アプリケーションが頻繁に参照を変更する場所を処理するためのものであったが、その削除によりネイティブメモリの使用量が削減され、他の用途に利用できるようになった。
JDK 21におけるGenerational ZGCとG1 GCの変更は、Javaアプリケーションのパフォーマンス向上や安定性の向上が期待される。