ガベージファースト・コレクタ

はじめに

ガベージファースト(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の推奨使用事例

G1が最初の重点は、制限されたGCレイテンシで大きなヒープを必要とするアプリケーションを実行するユーザーに対して、ソリューションを提供することです。これは、およそ6Gバイト以上のヒープ・サイズと、0.5秒未満の安定した予測可能な一時停止時間を意味します。

現在CMSまたはParallelOldガベージ・コレクタで実行しているアプリケーションが、次の特徴の1つ以上を備えている場合は、G1に切り替えることで利点が得られます。

Future

G1は、コンカレント・マーク・スイープ・コレクタ(CMS)を長期的に置き換えるものとして計画されています。G1をCMSと比較すると、G1をより優れたソリューションにする違いがあります。違いの1つは、G1が圧縮するコレクタであることです。G1は、精密な割当て用空きリストの使用を完全に回避するために十分に圧縮し、代わりにリージョンに依存します。これによって、コレクタの部品がかなり簡素化され、潜在的な断片化の問題がほぼ解消されます。また、G1は、CMSコレクタより予測可能なガベージ・コレクション一時停止を提供し、ユーザーは望ましい一時停止目標を指定できます。

G1の改善にご協力いただける場合は、試してから、OpenJDKおよびhotspot-gc-use@openjdk.java.netメーリング・リストでフィードバックをお寄せください。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.