Java 仮想マシン学習 - ガベージ コレクター

黄舟
リリース: 2017-02-17 10:42:17
オリジナル
1356 人が閲覧しました

HotSpot JVM コレクター

上記の 7 つのコレクターがあり、上位世代コレクターと下位世代コレクターの 2 つの部分に分かれています。 2 つのコレクター間に接続がある場合は、一緒に使用できます。

シリアル (シリアル GC) コレクター

シリアル コレクターは、コピー アルゴリズムを使用してシングル スレッドで実行される新世代のコレクターです。ガベージ コレクションの実行中は、他のすべてのワーカー スレッド (ユーザー スレッド) を一時停止する必要があります。これは、Jvm クライアント モードのデフォルトの新世代コレクターです。単一 CPU に限定された環境の場合、シリアル コレクターにはスレッド相互作用のオーバーヘッドがないため、ガベージ コレクションに重点を置くことで、自然に最高のシングル スレッド コレクション効率を達成できます。

ParNew (並列 GC) コレクター

ParNew コレクターは、実際には、ガベージ コレクションに複数のスレッドを使用することに加えて、残りの動作は次のとおりです。シリアルコレクターと同じです。

Parallel Scavenge (Parallel Recycling GC) Collector

Parallel Scavenge コレクターも、コピー アルゴリズムを使用する並列マルチスレッド コレクターです。並列 Scavenge コレクターの特徴は、CMS などのコレクターの焦点がガベージ コレクション中のユーザー スレッドの一時停止時間をできるだけ短縮することであるのに対し、並列 Scavenge コレクターの目的は他のコレクターとは異なることです。実現可能な制御されたスループットを達成することです。スループット = プログラム実行時間 / (プログラム実行時間 + ガベージ コレクション時間)、仮想マシンは合計 100 分間実行されました。このうち、ガベージコレクションには 1 分かかり、スループットは 99% です。

Serial Old (Serial GC) コレクター


Serial Old は、単一のスレッドを使用して収集を実行します。マークアンドオーガナイズ」アルゴリズム。主にクライアント モードの仮想マシンで使用されます。

Parallel Old (Parallel GC) Collector

Parallel Old は、マルチスレッドと「mark-compact」アルゴリズムを使用する Parallel Scavenge コレクターの旧世代バージョンです。

CMS (同時マークスイープ) コレクターは、最短の収集休止時間を取得するように設計されています。ターゲットコレクター。 CMS コレクターは、「マーククリア」アルゴリズムに基づいて実装されており、収集プロセス全体は、

①の 4 つのステップに分かれています。

②.CMS同時実行マーク

③.CMS発言

④.CMS同時スイープ

初期マーキングと再マーキングの 2 つのステップでは、依然として他のユーザー スレッドを一時停止する必要があります。初期マーキングでは、GC ROOTS が直接関連付けることができるオブジェクトのみがマークされます。これは非常に高速です。同時マーキング ステージは、オブジェクトが生きているかどうかを判断する GC ROOTS ルート検索アルゴリズムのステージです。再マーキング フェーズでは、同時マーキング期間中にユーザー プログラムが実行され続けたために変更されたオブジェクトのその部分のマーキング レコードを修正します。このフェーズの一時停止時間は、最初のマーキング フェーズよりもわずかに長くなります。ただし、同時マーキングフェーズよりも短いです。

コレクター スレッドは、プロセス全体で最長の同時マーキングおよび同時クリア プロセス中にユーザー スレッドと連携して動作できるため、全体として、CMS コレクターのメモリ リサイクル プロセスは実装されたユーザー スレッドと同時になります。

CMS コレクターの利点: 同時収集、短い一時停止ですが、CMS は完璧には程遠いですが、主に 3 つの重大な欠点があります:

CMS コレクターは CPU リソースに非常に敏感です。並行フェーズでは、ユーザー スレッドが一時停止することはありませんが、CPU リソースが占有され、参照プログラムの速度が低下し、合計スループットが低下します。 CMS によって開始されるリサイクル スレッドの数は、デフォルトで次のようになります: (CPU の数 + 3) / 4。

CMS コレクターは浮遊ガベージを処理できず、「同時モード障害」が発生する可能性があり、失敗後に別のフル GC が発生する可能性があります。 CMS の同時クリーンアップ フェーズ中もユーザー スレッドは実行されているため、プログラムが実行されて加熱されると、新しいガベージが生成され続けます。この部分のガベージは、CMS がこのコレクションで処理できず、処理する必要がある後に表示されます。次の GC を待ちます。このゴミの部分を「浮遊ゴミ」といいます。また、ガベージ コレクション フェーズでもユーザー スレッドを実行する必要があるため、ユーザー スレッドが使用するために十分なメモリ領域を予約する必要があるため、CMS コレクターは古い世代がほぼ完全に埋まるまで待つことができません。収集する前に他のコレクターを実行する必要があります。同時収集中のプログラム操作のためにメモリ領域の一部を予約する必要があります。デフォルト設定では、古い世代の領域の 68% が使用されたときに CMS コレクターがアクティブ化され、パラメーター -XX:CMSInitiatingOccupancyFraction の値を通じてトリガーの割合を指定して、メモリーのリサイクル回数を減らし、改善することもできます。パフォーマンス。 CMS の動作中に予約されたメモリがプログラムの他のスレッドのニーズを満たすことができない場合、「同時モード障害」障害が発生します。この時点で、仮想マシンはバックアップ プランを開始します。つまり、シリアル オールド コレクタが一時的に有効になります。古い世代でガベージを収集するため、一時停止が非常に長くなります。したがって、パラメータ -XX:CMSInitiatingOccupancyFraction の設定が高すぎると、「同時モード障害」が発生しやすくなり、パフォーマンスが低下します。

最後の欠点は、CMS が「mark-clear」アルゴリズムに基づいたコレクターであるため、「mark-clear」アルゴリズムを使用して収集した後、大量のフラグメントが生成されることです。スペースフラグメントが多すぎると、オブジェクトの割り当てに多くの問題が発生します。たとえば、大きなオブジェクトの場合、メモリスペースは割り当てるための連続したスペースを見つけることができず、事前にフル GC をトリガーする必要があります。この問題を解決するために、CMS コレクターは -XX:UseCMSCompactAtFullCollection スイッチ パラメーターを提供します。これは、フル GC の後に最適化プロセスを追加するために使用されます。また、-XX:CMSFullGCBeforeCompaction パラメーターを使用して、非圧縮フルを実行する回数を設定することもできます。 GC に続いてデフラグ プロセスを実行します。


G1 コレクター

G1 (Garbage First) コレクターは、JDK1.7 によって提供される新しいコレクターです。 G1 コレクターは、「マーク照合」に基づいています。つまり、メモリの断片化は発生しません。もう 1 つの特徴は、以前のコレクターは新世代または旧世代全体を収集していたのに対し、G1 は Java ヒープ全体 (新世代と旧世代を含む) を収集していたことです。


ガベージコレクターパラメータの概要

-XX:+

-XX:-

-XX:<オプション>=<数値>

-XX:<オプション>=<文字列>

UseCMSCompactAtFullCollection-XX:+CMSFullGCBeforeCompactionオフにするかどうかマニュアル System.gc-XX:+CMSParallelRemarkEnabledマークの一時停止を減らす-XX:LargePageSizeInBytes
パラメータ 説明

-XX:+UseSerialGC

クライアント モードで実行するための Jvm のデフォルト値。このスイッチをオンにした後、メモリの再利用のために Serial + Serial Old のコレクターの組み合わせを使用します
-XX:+UseParNewGC このスイッチは、ガベージ コレクションに ParNew + Serial Old コレクターを使用します
-XX:+UseConcMarkSoupGC メモリのリサイクルには ParNew + CMS + Serial Old コレクターの組み合わせを使用します。Serial Old は CMS として表示されます。同時「モード失敗後にフォールバック コレクターが使用されます」失敗。
-XX:+UseParallelGC Jvm は、このスイッチをオンにした後、Parallel Scavenge + Serial Old Collector の組み合わせを使用してリサイクル + します。 パラレル
リサイクルのための古いコレクターの組み合わせ
-XX:SurvivorRatio 新世代におけるEdenエリアとSurvivorエリアの容量比、デフォルトは8、つまりEden:Subrvivまたは= 8 :1
-XX:PretenureSizeThreshold このパラメータを設定すると、このパラメータより大きいオブジェクトは古い世代に直接割り当てられます。
-XX:MaxTenuringThreshold マイナー GC が発生するたびに、オブジェクトの経過時間が 1 ずつ増加します。このパラメータの値を超えると、古い世代に入ります。世代
-XX:UseAdaptiveSizePolicy 動的調整 Javaヒープの各領域のサイズと旧世代に入る年齢
-XX : +HandlePromotionFailure マイナーGCの後、別のブロックで新しい世代が保証を収集できるかどうかSurvivorスペースが不十分な場合、古い世代で直接予約されます
-XX:ParallelGCThreads メモリリサイクルのために並列GCで使用されるスレッド数を設定します
-XX:GCTimeRatio の比率合計時間に対する GC 時間。デフォルト値は 99 で、GC 時間の 1% が許容されます。 GC の最大一時停止時間を設定します。Parallel Scavenge コレクターで有効です
-XX:CMSInitiatingOccupancyFraction 古い世代のスペースがどれだけ使用された後に CMS コレクターがガベージ コレクションを開始するかを設定します。デフォルト。値は 68% で、これは CMS コレクターでのみ有効です。 -XX:CMSInitiatingOccupancyFraction=70 -XX:+
CMS コレクターはフラグメントを生成するため、このパラメーターはガベージ コレクターの後にメモリ デフラグ プロセスが必要かどうかを設定します。これは CMS コレクターを使用する場合にのみ有効です
数回後にメモリ デフラグ プロセスを実行するように CMS コレクターを設定します。ガベージ コレクション。通常は UseCMSCompactAtFullCollection パラメーターとともに使用されます
-XX:+UseFastAccessorMethods
元の型の最適化
-XX:+Disable ExplicitGC


メモリ ページのサイズはあまり大きく設定できません。これは Perm、-XX:LargePageSizeInBytes=128m のサイズに影響します


クライアントおよびサーバー モードのデフォルト GC




新世代のGCメソッド 古い世代と永続的な世代GCメソッド

クライアント

シリアルシリアルGC Serial Old Serial GC
Server パラレル スカベンジ パラレル スカベンジ


Sun/oracle JDK GC結合方式




Parallel GCシリアルGCParNewパラレルGCパラレルスカベンジリサイクルGC古いシリアルを使用
新世代GC方式 旧世代と永続性生成GCメソッド

-XX:+UseSerialGC

シリアルシリアルGC シリアル古いシリアルGC
-XX:+ParallelGC を使用する Parallel Scavenge Parallel Scavenge Serial Old ParNew
CMS Concurrent GC 表示される場合 「Concurrent Mode Failure」を使用した場合、Serial Old

-XX:+UseParNewGC
シリアル古いシリアルGC -XX: +UseParallelOldGC
パラレルオールドパラレルGC -XX:+UseConcMarkSweatGC -XX:+UseParNewGC
Serial シリアル GC

CMS 同時 GC
" 同時Mode Failure」と表示される
シリアルGCを使用

上記は Java 仮想マシン学習です - ガベージ コレクターの内容。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.ん)!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート