JVM ガベージ コレクション - ガベージ コレクター
シリアルガベージコレクター
Serial
シリアル: シングルスレッド環境用に設計されており、ガベージ コレクションに 1 つのスレッドのみを使用します。すべてのユーザー スレッドが一時停止されるため、サーバー環境には適していません。ヒープ メモリが小さいパーソナル コンピュータに適しています。
シリアルガベージコレクションを有効にする
-XX:+UseSerialGC = Serial + SerialOld
- シリアル: レプリケーション アルゴリズムを使用して、新世代のシリアル ガベージ コレクションを有効にします。
- SerialOld: 古い世代でシリアル ガベージ コレクションを有効にし、マーク ソート アルゴリズムを使用します。
- まず、ユーザー スレッドが安全なポイントに到達します [ガベージ コレクション中にメモリ アドレスの変更が行われます]。すべてのユーザー スレッドが実行を停止します。ガベージ コレクション スレッドがガベージを収集します。ガベージ コレクションが完了すると、ユーザー スレッドは実行を再開します。
スループット優先のガベージ コレクター
-
マルチスレッド化
-
ヒープ メモリが大きく、マルチコア CPU サポートが必要です (そうでないと、複数のスレッドが同じ CPU 時間セグメントを競合します)
-
単位時間内でstwが最も短い時間
0.2 0.2=0.4 一小时内总的stw时间最短,单次较长
スループット優先のガベージ コレクターを有効にする
-XX:+UseParallelGC ~ -XX:+UseParallelOldGC //开启一个,另一个也会自动开启(jdk1.8默认开启)
-
+UseParallelGC: レプリケーション アルゴリズムを使用して、新世代のスループット優先ガベージ コレクションを有効にします。
-
+UseParallelOldGC: マークソートアルゴリズムを使用して、古い世代のスループット優先ガベージコレクションを有効にします。
-
-XX:ParallelGCThreads=n ガベージ コレクション スレッドの数を設定します。設定しない場合、デフォルトのガベージ コレクション スレッド数は CPU コアの数と一致します。
-
-XX:+UseAdaptiveSizePolicy は、GC の状況に応じて Eden、From、To 領域のサイズを自動的に計算します。プロモーションしきい値にも影響します。jdk1.8 ではデフォルトで有効になっています。
-
-XX:GCTimeRatio=ratio GC 時間比率、
ratio
デフォルトは 99、計算式: gc 時間比率 = 1/(1+比率)、つまり、デフォルト比率は 1/100 で、これは 100 分のガベージ コレクションに相当します。 1 分を超える場合は、ヒープ メモリ サイズが自動的に調整され、ヒープ メモリが増加します。heap size++ -> gc count--
-
-XX:MaxGCPauseMillis=ms ガベージ コレクションの最大一時停止時間
- デフォルトは 200ms ですが、ヒープメモリが増加すると、各 gc にかかる時間も増加します (ヒープ内のゴミをスキャンする必要があり、スキャンとリサイクルの時間が増加します)。そのため、最大一時停止時間を確保する必要があります。は
GCTimeRatio
ヒープが減少することを意味します。
- デフォルトは 200ms ですが、ヒープメモリが増加すると、各 gc にかかる時間も増加します (ヒープ内のゴミをスキャンする必要があり、スキャンとリサイクルの時間が増加します)。そのため、最大一時停止時間を確保する必要があります。は
応答時間優先ガベージコレクタ
-
マルチスレッド化
-
大規模なヒープ メモリ、マルチコア CPU シナリオ
-
stw
各移動時間はできるだけ短くしてください0.1 0.1 0.1 0.1 0.1 =0.5 单次时间最短 总时间较长
-
応答時間優先のガベージ コレクターを有効にする
-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld
- UseConcMarkSoupGC (CMS): マーク アンド スイープに基づくガベージ コレクターであり、古い世代で並行して動作します。
- UseParNewGC: 新世代で動作し、コピー アルゴリズムを使用するガベージ コレクター
CMS
ガベージ コレクターが同時に失敗すると、ガベージ コレクターconcurrent mode fialure
に縮退します。SerialOld
-XX:ParallelGCThreads=n
(ガベージコレクションの並列スレッド数) ~-XX:ConcGCThreads=threads
(ガベージコレクションの同時スレッド数)。通常、同時スレッド数は並列スレッド数の 1/4 に設定されます。-XX:CMSInitiatingOccupancyFraction=percent
cms ガベージ コレクションを実行するときのメモリ比率。パーセント = 80 と仮定します。つまり、古い世代のメモリ使用量が 80% に達すると、メモリ クリーンアップがトリガーされます (同時クリーンアップであるため、実行中に新しいガベージ [フローティング ガベージ] が生成されます)。クリーンアップを行うため、スペースを確保する必要があります。ゴミのこの部分が占有します)-XX:+CMSScavengeBeforeRemark
CMS GC のリマーク フェーズが開始する前に Young GC を使用すると、ParNewGC
Young Gen から Old Gen への無効な参照が減り、CMS リマーク フェーズの時間オーバーヘッドが削減されます。
問題があります
- CMS ガベージ コレクターはマーク アンド スイープ アルゴリズムを使用するため、メモリの断片化が発生します。
- CMS の GC 時間の 80% はリマーク フェーズに費やされ、リマーク フェーズの一時停止時間は非常に長くなります。
- 同時モードの失敗: この例外は、cms がリサイクルされているときに発生します。CMS GC の実行中、ビジネス スレッドも同時に実行されます。若い世代の領域がいっぱいになると、実行中に生き残った
ygc
オブジェクトを古い世代に入れる必要があります。このとき、古い世代の領域は不足しており、 CMS はそれをリサイクルする機会がありません。古い世代で生成されるか、マイナー GC を実行するときに新世代のレスキュー スペースに対応できないため、古い世代に配置する必要があり、古い世代では使用できません。収容される。 - 昇格に失敗しました: マイナー GC を実行するとき、Survivor の領域が不十分で、オブジェクトは古い世代にのみ配置できます。現時点では、古い世代を配置できません。主な理由は、古い世代に十分な空き領域があるためですが、フラグメントが多いと、新しい世代を配置できません。古い世代ゾーンに転送されるオブジェクトは比較的大きく、オブジェクトを格納するための連続領域が見つかりません。次のステップが発生し、ガベージ コレクターの機能が低下
promotion failed
しconcurrent mode fialure
ますSerialOld
。今度は、スループットが大幅に低下します。
4 段階の CMS ガベージ コレクター**
-
フェーズ 1 (初期マーキング): ルート オブジェクトによって直接参照されるオブジェクトと、若い世代のすべての存続オブジェクトによって参照される古い世代のオブジェクトを含む、古い世代のすべてのルート オブジェクトをマークします (GC ルートが直接関係できるもののみをマークします)。オブジェクト、非常に高速)、トリガーされます
stw
-
フェーズ 2 (同時マーキング):最初のマーキング フェーズでマークされたオブジェクトから開始して、生き残っているすべてのオブジェクトを検索します。
並行して動作するため、運用中に新世代のオブジェクトが旧世代に昇格したり、旧世代に直接オブジェクトが割り当てられたり、旧世代のオブジェクトの参照関係が更新されたりします。これらのオブジェクトは、そうしないと、一部のオブジェクトが見逃され、入札の逃しが発生します。再マーキングの効率を向上させるために、この段階では、上記のオブジェクトが配置されているカードをダーティとしてマークします。その後、古い世代全体をスキャンするのを避けるために、これらのダーティ カードのオブジェクトのみをスキャンする必要があります。同時マーキング ステージは、参照がダーティとして変更されたカードをマーキングすることのみを担当し、処理は担当しません。
-
フェーズ 3 (再マーキング): 同時マーキング期間中にユーザー プログラムの継続的な動作により変更されたオブジェクトのその部分のマーキング レコードを修正するために、この段階での一時停止時間は通常、初期マーキング段階ですが、同時マーキング期間よりもはるかに長く、時間は短いです。この段階では次のことも必要です
stw
-
フェーズ 4 (同時クリア): このフェーズでは主にマークされていないオブジェクトをクリアし、スペースを再利用します)