Garbage Collectors Algorithms
Garbage Collectors は通常、次の目標を持ちます (言うほど簡単ではない)
- 数ミリ秒を目標とする非常に短い “stop the world pauses”
- Pause time is not increase with heap, live-set, またはルートヒープサイズは数MBから数TBまで対応
- 高い並行性 – Javaスレッドが実行を続ける間に、重い仕事はすべて行われる
- 高いスループットEasy to tune
Garbage Collectors
ヒープ内のデータは複数の割り当て領域(または世代)に分割され、オブジェクト年齢(つまり年齢)に応じて別々に保持されます。この世代は、オブジェクトの年齢 (すなわち、生存している GC 反復の数) に基づいて分離されています。 いくつかのコレクターは単一世代ですが、他のコレクターは 2 つの世代を使用します。 (1) 若い世代 (さらに Eden と 2 つの生存者領域に分割)、および (2) 古い (または在職中の) 世代です。 Ionut Balosin
によるブログ
2世代コレクター:
Serial GC – このアルゴリズムは、すべてのガベージ コレクション作業を行うために 1 つのスレッドを使用し、スレッド間の通信オーバーヘッドがないため比較的効率的です。 マルチプロセッサ・ハードウェアを利用できないため、シングル・プロセッサ・マシンに最適です。
スループット (並列) GC – このアルゴリズムは、若い世代でマーク-コピー、古い世代でマーク-スイープ-コンパクトを使用します。 ヤングとオールドの両方のコレクションは、stop-the-world イベントをトリガーし、すべてのアプリケーション スレッドを停止して、ガベージ コレクションを実行します。 両方のコレクターは、複数のスレッドを使用してマークおよびコピー/コンパクト化フェーズを実行するため、「並列」という名前がついています。
Parallel Garbage Collector は、スループットを向上することが主目的の場合にマルチコアマシンに適しています。
- 収集中、すべてのコアは並行してゴミを清掃し、より短い休止時間をもたらします。
- ゴミ収集サイクルの間、どちらのコレクターもいかなるリソースも消費しません
Garbage First (G1) GC – このコレクターは大きなメモリを持つマルチプロセッサのマシン向けに、サーバースタイルのゴミ収集器となっています。 高いスループットを達成しながら、高い確率でガベージコレクション(GC)休止時間の目標を達成します。
- G1コレクターは、ヒープメモリモデルの面で異なるアプローチを取ります。
- 特定の領域セットは古いコレクターと同じ役割 (eden, survivor, old) を割り当てられるが、それらのための固定サイズはない。
- 領域サイズは起動時に JVM によって選択される。 JVM は一般的に 1 から 32Mb までの大きさの約 2000 の領域をターゲットにしています。 G1 コレクターは異なるアプローチ
詳細については、G1 GC
Uni generational collectorsを参照して下さい。
Shenandoah GC – Shenandoah は、実行中の Java プログラムと同時に多くのガベージコレクション作業を実行することで GC の一時停止時間を短縮する低一時停止時間のガベージコレクタです。 Shenandoah は、同時コンパクションを含む GC 作業の大部分を同時に行い、その休止時間は、もはやヒープのサイズに正比例しないことを意味します。 200 GB のヒープまたは 2 GB のヒープをガベージコレクションすると、同様の低い一時停止動作になるはずです。
詳細については、Wiki
Z GC – ZGC は、並列、単一世代、リージョンベース、NUMA を意識した、コンパクト化コレクターです。 stop-the-world フェーズはルートスキャンに限定されているので、GC の休止時間はヒープやライブセットのサイズによって増加しない。
より詳細については、YouTube の Per Liden による ZGC に関するセッション
最後に、Epsilon GC (experimental)- メモリ割り当てを扱う GC だが、実際のメモリ再生メカニズムの実装はない。 利用可能な Java ヒープが使い果たされると、JVM はシャットダウンします。 JDK 内部テストのために設計されたが、考えられるところでは、2 つの状況で有用となることができる
- 非常に短命のプログラム
- プログラムは、メモリを再利用して決して新しい割り当ては実行しないように慎重に書かれている
。