読者は、コピーコレクタ、Mark-Sweep-Compactアルゴリズム、世代別ガベージコレクション(世代別コレクション)など、ガベージコレクションの基本概念を既に理解していることを前提としています。
また、この記事はガベージコレクションアルゴリズムの完全な説明であるとは主張していないことをすぐに言っておく必要があります。ネットワークには、どのアルゴリズムについても十分に説明された資料があります。 概念的に類似したアルゴリズムの実装は、JVMごとに大きく異なる可能性があります。シングルスレッドのMark-Sweep-Compactがどこでもほぼ同じように実装されている場合、競合するMark-Sweep-Compactにはすでにさまざまなバリエーションがありますが、これもここでは影響を受けません。
Oracle HostSpot JVM(バージョン6および7)
HotSpotのほとんどすべてのガベージコレクションモードは、世代ごとに使用します。 ヒープ全体は、オブジェクトの年齢に応じて3世代に分けられます。それぞれ、若者向けのYoung、「成熟」向けのTenured、クラスおよび定数プール向けのPermです。 次に、Young世代はさらに3つのエリア-Edenと2つのSurviverエリアに分割されます。 最初に、オブジェクトはEdenで作成され、次にSurviverエリアに(1回以上)落ち、次にTenuredでのみ作成されます。 G1の場合、世代分割も存在しますが、異なる特性があります(以下で説明します)。
コピー(-XX:+ UseSerialGC)
Young世代の単一行( シリアル )コピーコレクター。
ParNew(-XX:+ UseParNewGC)
Young世代のマルチスレッド( 並列 )コピーコレクター。
MarkSweepCompact(-XX:+ UseSerialGC)
Mark-Sweep-Compactアルゴリズムを使用したTenured生成用のシングルスレッドコレクター。
ConcurrentMarkSweep(-XX:+ UseConcMarkSweepGC)
Tenured世代向けの競争力のあるMark-Sweep( 同時 )コレクターであり、ほとんどの場合、アプリケーションスレッドと同時に動作します。 強力なフラグメンテーションにより、 MarkSweepCompactは支援のためにシングルスレッドになります。 追加のオプションが可能です:
- -XX:±CMSIncrementalMode-増分同時GCアルゴリズムを使用または無効にします
- -XX:±CMSConcurrentMTEnabled-並列(マルチスレッド)コンカレントGCアルゴリズムを使用または無効にします
- -XX:±UseCMSCompactAtFullCollection-フルGCの発生時に圧縮を使用または無効化
PS Scavenge + PS MarkSweep(-XX:+ UseParallelGC -XX:+ UseParallelOldGC)
Young世代では、 ParNewに似たPS Scavengeマルチスレッドコピーコレクターが使用されます。 Tenured世代では、 PS MarkSweepが使用されます。これは、Mark-Sweep-Compactアルゴリズムのマルチスレッドバージョンです。 コレクターのこのペアは、いわゆるをサポートしています。 アダプティブサイズポリシー(またはGCエルゴノミクス)-指定された一時停止を実現するために、YoungおよびTenured世代のサイズを自動的に最適化するJVMの機能。 追加のオプションが可能です:
- -XX:±UseAdaptiveSizePolicy-適応サイズポリシーを使用または無効にします
- -XX:MaxGCPauseMillis = nnn-望ましい最大GC一時停止時間を設定します
- -XX:GCTimeRatio = nnn-アプリケーションとGCの作業時間の望ましい関係を設定します
G1 Young Generation + G1 Mixed Generation(-XX:+ UseG1GC)
「地域」アセンブリを使用する新しいモード。 ヒープは、同じサイズ(0.5〜2 mb)の多くの領域に分割されます。 競合するトレースマーキングプロセスは、領域内の生きているオブジェクトのサイズを推定します。これは、アプリケーションフローを停止することなく並行して行われます。 次のサイクルでは、GCはすべてのYoung領域(新しいオブジェクトが作成される特別な領域)と、最小サイズの生きているオブジェクトを処理します。 T.O. コレクターは、リージョン間のコピーの数を最小化します。 ここで、目的の一時停止時間を設定することもできます。
- -XX:MaxGCPauseMillis = nnn-望ましい最大GC一時停止時間を設定します
IBM J9 JVM
HotSpotとは異なり、J9では1つのモードのみが世代を超えてアセンブリを使用します。 ただし、この場合、Young世代は3つではなく、2つのエリア-EdenとSurviverに分割されます。 T.O. SurviverからのオブジェクトはすぐにTenuredに落ちます。 そして、Eden <Surviverの場合、一部のオブジェクトはすぐにEdenからTenuredに到達する機会があります。
-Xgcpolicy:optthruput
ヒープ全体を処理するマルチスレッドMark-Sweep-Compactコレクター。
-Xgcpolicy:optavgpause
ヒープ全体の競争力のあるMark-Sweep-Compactコレクター。ほとんどの場合、アプリケーションと同時に動作します。 GCによる一時停止をスムーズにするように設計されています。
-Xgcpolicy:gencon
世代のジェネレータ。 若い世代の場合、マルチスレッドコピーコレクターが使用されますが、3つの領域ではなく、2つだけが使用されます-EdenとSurviver。 次のGCサイクルでSurviverに入ったオブジェクトは、Tenured世代に分類されます。 Tenured世代では、上記の競争力のあるMark-Sweep-Compactマニホールドが使用されます。
-Xgcpolicy:バランス
ヒープを多くの地域に分割する新しいコレクター。 Oracle HotSpotのG1と概念が似ています。
Oracle JRockit JVM
JRockit 2は世代ごとにビルドされますが、Young世代はさらにシンプルです。まったく壊れず、最初のコレクターサイクルで、EdenのオブジェクトがすぐにTenuredに落ちます。
JRockitでは、動的モードと静的モードを選択できます。 動的モード-スループット、休止時間、決定論-目標を決定し、状況に応じてパラメーターとアセンブリアルゴリズム自体を動的に変更できます。 ガベージの収集方法をより正確に決定する静的モードもありますが、それらについては停止します。
-Xgc:singlepar
ヒープ全体を処理するマルチスレッドMark-Sweep-Compactコレクター。
-Xgc:genpar
世代のジェネレータ。 若い世代の場合、マルチスレッドコピーコレクターが使用されます。 Tenured世代では、マルチスレッドのMark-Sweep-Compactが使用されます。
-Xgc:singlecon
ヒープ全体の競争力のあるMark-Sweep-Compactコレクター。ほとんどの場合、アプリケーションと同時に動作します。
-Xgc:gencon
世代のジェネレータ。 Young世代では、シングルスレッドコピーコレクターが使用されます。 Tenured世代では、singleconに似た競争力のあるMark-Sweep-Compactコレクターが使用されます。
さまざまなガベージコレクションモードの一致テーブル
HotSpot JVMでは、世代ごとにコレクターのタイプを個別に設定できます。 ただし、すべての若い世代のコレクターがTenured世代のコレクターのいずれかと連携できるわけではありません。 可能な組み合わせは6つのみです。 それらはすべて、JRockitおよびJ9の対応する(存在する場合)類推とともに、以下の表にリストされています。
Oracle HotSpot | IBM j9 | Oracle JRockit |
---|---|---|
-XX:+ UseSerialGC
コピー+ MarkSweepCompact | ||
-XX:+ UseG1GC
G1ヤング+ G1ミックス | -Xgcpolicy:バランス
| |
-XX:+ UseParallelGC
-XX:+ UseParallelOldGC PS Scavenge + PS MarkSweep | -Xgcpolicy:optthruput *
| -Xgc:genpar
-Xgc:singlepar * |
-XX:+ UseParNewGC
ParNew + MarkSweepCompact |
| |
-XX:+ UseConcMarkSweepGC
-XX:+ UseParNewGC ParNew + ConcurrentMarkSweep | -Xgcpolicy:optavgpause *
| -Xgc:singlecon *
|
-XX:+ UseConcMarkSweepGC
-XX:-UseParNewGC コピー+ ConcurrentMarkSweep | -Xgcpolicy:gencon
-Xgcpolicy:optavgpause * | -Xgc:gencon
-Xgc:singlecon * |
*-Tenured世代のクリーニング方法のみの類似点。
ソース
http://www.fasterj.com/articles/oraclecollectors1.shtml
http://www.ibm.com/developerworks/websphere/techjournal/1106_bailey/1106_bailey.html
http://www.ibm.com/developerworks/websphere/techjournal/1108_sciampacone/1108_sciampacone.html
http://www.techpaste.com/2012/02/java-garbage-collectors-gc/
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/memman.html#wp1087125
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp1017849