ガベージファースト (G1) ガベージコレクタは、Oracle JDK 7 update 4 以降のリリースで完全にサポートされています。G1 コレクタは、大容量のメモリーを搭載するマルチプロセッサマシンを対象とした、サーバースタイルガベージコレクタです。ガベージコレクション (GC) 一時停止時間目標を高い確率で満たしながら、高いスループットを実現します。グローバルマーキングなどのヒープ全体オペレーションは、アプリケーションスレッドと同時に実行されます。これによって、割り込みがヒープまたはライブデータサイズに比例するのを防ぎます。
G1 コレクタは、いくつかの技術によって高いパフォーマンスおよび一時停止時間目標を実現します。
ヒープは、均等サイズのヒープリージョンセットに分割され、それぞれは連続する一連の仮想メモリーです。G1 は、ヒープ全体のオブジェクトがライブかどうかを判断する、同時グローバルマーキングフェーズを実行します。マーキングフェーズの完了後、G1 はどのリージョンがほぼ空であるかを認識します。それらのリージョンを最初に収集し、通常は多くのスペースを解放します。このため、この方式のガベージコレクションがガベージファーストと呼ばれます。G1 はその名が示すとおり、再生可能なオブジェクト (ガベージ) でいっぱいとなっている可能性の高いヒープ領域に対して、収集および圧縮活動を集中します。G1 は、ユーザー定義の一時停止時間目標を満たすために一時停止予測モデルを使用し、指定された一時停止時間目標に基づいて収集するリージョン数を選択します。
G1 によって再生する時期と識別されたリージョンは、退避を使用してガベージコレクトされます。G1 は、ヒープの 1 つ以上のリージョンからヒープ上の単一リージョンにオブジェクトをコピーし、その処理内でメモリーを圧縮して解放します。この退避は、一時停止時間を減らし、スループットを向上させるために、マルチプロセッサ上でパラレルで実行されます。このように、各ガベージコレクションで、G1 はユーザー定義の一時停止時間内で、継続的に断片化を減らすために動作します。これは以前の 2 つの方式の能力を上回っています。CMS (Concurrent Mark Sweep) ガベージコレクションは圧縮を行いません。ParallelOld ガベージコレクションはヒープ全体圧縮のみを実行するため、一時停止時間が長くなります。
G1 はリアルタイムコレクタではなことに注目することが重要です。設定された一時停止時間目標を高い確率で満たしますが、絶対確実ではありません。G1 は、以前の収集からのデータに基づき、ユーザー指定の目標時間内に収集できるリージョン数を見積もります。このため、コレクタはリージョンを収集するコストの妥当に正確なモデルを持っており、これを使用して一時停止時間目標内でどのリージョンをどのくらい収集するかを判断します。
G1 が最初の重点は、制限された GC レイテンシで大きなヒープを必要とするアプリケーションを実行するユーザーに対して、ソリューションを提供することです。これは、およそ 6G バイト以上のヒープサイズと、0.5 秒未満の安定した予測可能な一時停止時間を意味します。
現在 CMS または ParallelOld ガベージコレクタで実行しているアプリケーションが、次の特徴の 1 つ以上を備えている場合は、G1 に切り替えることで利点が得られます。
G1 は、コンカレントマークスイープコレクタ (CMS) を長期的に置き換えるものとして計画されています。G1 を CMS と比較すると、G1 をより優れたソリューションにする違いがあります。違いの 1 つは、G1 が圧縮するコレクタであることです。G1 は、精密な割り当て用空きリストの使用を完全に回避するために十分に圧縮し、代わりにリージョンに依存します。これによって、コレクタの部品がかなり簡素化され、潜在的な断片化の問題がほぼ解消されます。また、G1 は、CMS コレクタより予測可能なガベージコレクション一時停止を提供し、ユーザーは望ましい一時停止目標を指定できます。
G1 の改善にご協力いただける場合は、試してから、OpenJDK および hotspot-gc-use@openjdk.java.net メーリングリストでフィードバックをお寄せください。