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

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

ガベージファースト(G1)コレクタとは、大容量のメモリを搭載するマルチプロセッサを対象としたサーバースタイルのガベージ・コレクタです。ソフト・リアルタイム目標を高確率で達成し、かつ高いスループットを実現します。 G1は長期的には、並行マークスイープ・コレクタ(CMS)の後継となる技術です。 グローバル・マーキングなどのヒープ全体に対する処理は、アプリケーション・スレッドと並行して実行されます。これによって、割込みがヒープ・サイズまたはライブ・データ・サイズに比例して増加するのを防ぎます。 また、並行マーキングによって、コレクション処理の"完全性"が確保され、コンパクト化を伴う退避によって再利用の対象となるリージョンが特定されます。 この退避はマルチプロセッサ上で並行して実行されるので、一時停止の時間が短縮し、スループットが向上します。

G1コレクタは、さまざまな技術を使用してこれらの目標を達成します。 ヒープは均等サイズのヒープ・リージョンにパーティション化されます。それぞれのヒープ・リージョンは、連続した範囲の仮想メモリです。 G1は処理中にコンパクト化を行います。 この際に、ヒープ領域内のオブジェクトを別のヒープ領域にコピーします。 このため、CMSで発生しうる断片化の問題はG1では発生しません。 連続した空きスペースの領域が常に存在してそれを割り当てることができるので、G1では時間が経過しても一貫性のある一時停止を行えることになります。 G1では、ユーザー定義の一時停止目標を達成するために一時停止予測モデルが使用されます。 このモデルでは、CMSと同様のスループットでCMSよりもスムーズに一時停止時間を確保できます。

G1では、ヒープ全体でのオブジェクトの生存(ライブ)状態を判断するグローバル・マーキング・フェーズを実行した後は、ヒープ内でほぼ空となっているリージョンがどこにあるかを即座に認識できます。 このようなリージョンを最初に扱うので、多くのスペースが利用できるようになります。 このようにして、ガベージ・コレクタはより余裕のあるスペースを取得します。この結果、フルGCが実行される可能性を抑えられるのです。 ガベージ・コレクタがガベージファーストと呼ばれる理由はこの点にもあります。 G1はその名が示すとおり、まず再利用可能なオブジェクトで一杯となっている可能性の高いヒープ領域に対して、コレクションとコンパクト化の処理を集中的に実行します。

ほとんどのリアルタイム・コレクタがオブジェクト単位の非常に粒度の細かいレベルで動作するのに対して、G1はリージョン・レベルでコレクションを実行します。 ライブ・オブジェクトを含まないリージョンがある場合は、即座に再利用されます。 ユーザーは一時停止の目標を指定でき、G1は前回までのコレクションに基づいて、指定された時間でコレクションを実行できるリージョンの数を見積もります。 このために、コレクタはリージョンのコレクションの実行コストに関する適度に正確なモデルを使用します。その結果、"コレクタは、指定された一時停止時間の制限以内で、高確率でコレクションを実行できるリージョンのセットを選択できます"。 言いかえれば、G1はハード・リアルタイム・コレクタではなく、ソフト・リアルタイムの目標を高確率で達成しますが、これは絶対に確実というわけではありません。 G1は、ややソフトでありながらも適度に厳格なリアルタイム制約がある見返りとして、高いスループットを達成するよう試みます。 これは、大規模なサーバー・アプリケーションに向いています。このようなアプリケーションでは多くの場合、大容量のライブ・ヒープ・データとかなりのスレッドレベルの並列性が求められるからです。 また、G1ではユーザーがより精密な制御を行うことができ、実行時間中の、ガベージ・コレクションにかかる時間の割合を指定できます。 たとえば、250msの実行ごとに、50ms未満のガベージ・コレクションの時間をかけるという指定が可能です。

G1は、Hotspot JVMでのCMSを置き換える技術として計画されています。 CMSとG1にはおもな違いが2つあります。 1つは、G1はコンパクト化を伴うコレクタであるということです。 G1では十分なコンパクト化を行うことで、割当て用の粒度の細かい空き領域リストを使用せずに済みます。これによって、コレクタの部品が相当シンプルになり、潜在的な断片化の問題がほぼ解消されます。 コンパクト化と同様に、G1ではCMSコレクタと比較して、ガベージ・コレクションの一時停止がより予測しやすくなっており、ユーザーは任意の一時停止目標を設定できます。

▲ ページTOPに戻る