GC知識サプリメント--CMS

すでに今日のGCの内容について多くのことを話した前にサプリメントセクションの前に詳細に行く準備ができていない、言及する最初は、ガベージコレクタということです。

:リサイクルの3つの基本的な方法があり清除压缩复制ガベージコレクタが持つ由来は:

シリアルコレクター

コレクターの新世代は、スレッドGCを使用して、コピーアルゴリズムを使用して停止し、シリアル、他のワーカースレッドが中断します。

使用して-XX:+UseSerialGCの使用を制御するスイッチをSerial + Serial Old(クライアント・モードで実行している仮想マシンのデフォルト値である)、メモリ回復のためのモードを。

ParNewコレクター

コレクターの新世代は、時間のガベージコレクションを短縮するために、注意を作業を中断し、並列で複数のスレッド、他のスレッドとGCのコピー・アルゴリズム、シリアルコレクタマルチスレッドバージョンを使用して停止します。

使用-XX:+UseParNewGCの使用を制御するためにスイッチをParNew + Serial Oldメモリの組み合わせを収集するコレクタと、使用される-XX:ParallelGCThreads実行のガベージコレクションスレッドの数を設定します。

並列スカベンジコレクタ

コレクタ新世代は、停止複製アルゴリズム、注目CPUスループット、すなわち使用运行用户代码的时间/总时间、例えば:JVMは100分とユーザーコードを実行するために99分間、ガベージコレクション1分間実行するように、スループットは99%であったことは、最も効率的な集電することができますCPUの使用は、バックグラウンド操作を実行するために(他の懸念は、ユーザーとの対話のためので、少し時間を待って、そのようなCMSとして、ごみ収集時間コレクタを短縮し、ユーザーエクスペリエンスを向上させます)。

使用-XX:+UseParallelGC用いたスイッチング制御をParallel Scavenge + Serial Old使用する;(Serverのデフォルトモードである)コレクタ組成ごみを-XX:GCTimeRatioデフォルト99、またはガベージコレクションのために使用される時間の1%は、時間の割合を設定することをユーザに実行に費やさ。使用する-XX:MaxGCPauseMillis最大GC休止時間を(このパラメータは、清掃をパラレルに有効です)の設定、パラメータのスイッチを-XX:+UseAdaptiveSizePolicy動的に制御することができ、エデン/サバイバー比、対象年齢歳、新世代のサイズの自動調整は、このパラメータはParNewではありません。

シリアル・オールド・コレクター

使用してコレクタ歳、シングルスレッドのコレクション、シリアル、标记-整理単一スレッドを使用したアルゴリズムは、GC、別のワーカー中断(古い時代の中で注意した标记-整理、JDK1.5前に、クリーンアップするアルゴリズムが、他のスレッドを中断する必要があります)使用して、シリアル旧コレクターやParallelScavenge。

スイープは、(クリア)メソッドを終了するとコンパクト(圧縮)、廃棄物を削除するとされているのは、スペースがメモリは2、全体のオブジェクトに分割されることを保証するために入力されます圧縮されたオブジェクトを移動する、唯一生き残ったオブジェクトを残して、取り除くことです)アイドル、

パラレルオールド・コレクター

コレクターの歳、マルチスレッド、並列、マルチスレッドメカニズムとパラレル清掃を貧しい人々に良い使用标记-整理するアルゴリズム、パラレル古い、実行、仕事はまだ他のスレッドを中断する必要があります。

パラレルオールド・コレクタ、およびシリアル旧別の種類の仕上げは、ここにコピー(コピー)とコンパクト(圧縮)、複製ではなくスイープよりも、事前に準備された領域に生き残ったオブジェクトをコピーすることを意味します(クリア)などがありますクリアオブジェクトを破棄しました。

平行旧は、マルチコア・コンピューティングに有用です。後に(JDK 1.6)パラレルオールドが発生し、良好な結果と並列の清掃、及び全並列スカベンジコレクタスループット優先効果を反映しています。使用して-XX:+UseParallelOldGC使用してスイッチング制御をParallel Scavenge + Parallel Old収集するために、集電体の組み合わせを。

CMS

並行マークスイープ、古いコレクターの最短コレクションの休止時間を得ることにコミット(つまり、減少ガベージコレクション時間、である)、の使用の完全な名前标记-清除のアルゴリズム、マルチスレッド、同時コレクタ(ユーザスレッドが同時に動作するとGCスレッドができ)、小休止の利点。

使用が-XX:+UseConcMarkSweepGC行われParNew + CMS + Serial Old、好ましくは、使用されるメモリリコールのためParNew + CMSの代替使用する場合(後で理由を参照)メモリのうち、ユーザスレッドSerial Oldコレクション。

どのように始めるために

CMS GCを初めて目にはどのような状況下にあります。

  1. まずJVMによると-XX:CMSInitiatingOccupancyFraction-XX:+UseCMSInitiatingOccupancyOnlyガベージコレクションを開始するために何時間決定します。
  2. 設定した場合-XX:+UseCMSInitiatingOccupancyOnly、その後の占領の歳は確かに達成したときにのみ-XX:CMSInitiatingOccupancyFractionとき、設定されたパラメータの比率CMS GCをトリガします。
  3. 設定されていない場合は-XX:+UseCMSInitiatingOccupancyOnly、システムがCMS GCをトリガーするタイミングを決定するために統計的なデータに基づいて行われます。だから、時々の出会いは、このパラメータが設定されていないので、理由は、80%にCMS GCの割合を設定したが、50%がトリガされていました。

特定の実行

CMS GCの実装プロセスは、具体的にその:

初期ラベル(CMS-初期マーク)

ステージは、世界の舞台を停止され、この段階では、ルートセットからオブジェクトへの唯一の最も直接的なアクセス対象となりました。

CMS-初期マーク:961330K(1572864K)、インデックスが覚えて、使用スペースと古い時代の総容量このフェーズでは、ログを出力します

並行マーク(CMS-同時マーク)

この段階では、アプリケーションと並行スレッドを実行する、いわゆる同時コレクタは、主な役割は、ユーザスレッド休止を必要としないこの段階でオブジェクトをマークアップすることであり、これを指します。

CMS-同時マークスタート、CMS-同時マーク:このフェーズでは、2つのログを出力します

前洗浄(CMS-同時-予備洗浄)

マーキング及びアプリケーションのスレッドが同時に実行され、したがって、いくつかのオブジェクトの状態は、標識後に変更されるため、この段階は、いくつかの事前洗浄され、この段階では、この問題を解決することです。CMS-発言は後の段階で可能な限り小さく、時間のポーズを作るために、世界を停止しますので、また、私たちは、時間を節約するために、作業の最初の予備洗浄段階の一部を行う必要があります。

CMS-同時-予備洗浄開始、CMS-同時-予備洗浄:このフェーズでは、2つのログを出力します

制御された予備洗浄(CMS-同時-abortable-プレクリーン)

このフェーズの目的は、アプリケーションが時間を停止する原因となるCMS-発言段階を減らすために、いくつかの役割はまた、いくつかの予備洗浄を行うCMS GCをより制御することです。

このフェーズでは、いくつかのパラメータが含まれます。

    -XX:CMSMaxAbortablePrecleanTime:当 abortable-preclean 阶段执行达到这个时间时才会结束。
    -XX:CMSScheduleRemarkEdenSizeThreshold(默认2m):控制 abortable-preclean 阶段什么时候开始执行,即当年轻代使用达到此值时,才会开始 abortable-preclean 阶段。
    -XX:CMSScheduleRemarkEdenPenetratio(默认50%):控制 abortable-preclean 阶段什么时候结束执行。

このフェーズでは、3つのログを出力します:CMS-同時-abortable-プレクリーンスタート、CMS-同時-abortable-プレクリーン、CMSは:XXXタイムによる予備洗浄中止を

ラベル変更(CMS-発言)

この段階では、アプリケーションスレッドを中断滞留時間が、わずかに長く、最初のタグよりも、すべてのオブジェクトが再スキャンし、標識されますので、並行マークよりもはるかに小さいします。

この段階では、次のログを出力します:

  1. YG占有:若い世代を実行するとき964861K(2403008K)は、状況を指します。
  2. CMSの発言:老後を実行するとき961330K(1572864K)は、状況を指します。
  3. 加えて処理し、クラスのアンロード処理のような弱参照の印刷処理、。

同時クリア(CMS-同時スイープ)

この段階同時ごみ。

次のトリガを待って同時リセット状態CMS(CMS-同時リセット)

この段階では、次のCMS GCデータ構造のためにリセットされます。

概要

CMS収集プロセスは、要約である:2マーク、二回前にクリア、再びマークし、一度クリア。

それは非常にインタラクティブなアプリケーションに適している、洗浄工程におけるCMS、唯一の初期マーキングおよび再マーキングスレッドのユーザー短い休止を必要とし、並行マークと同時ユーザーをクリアするには、スレッドを一時停止する必要がないので、効率が非常に高いです。

また、CMSは缺点、それは追加のCPUとメモリリソースを消費する必要があります。CPUとメモリリソースの制約では、それはシステム(起動するスレッドのCMSのデフォルト数(CPU + 3の数)/ 4)の負担が増加します。

また、同時収集プロセス、ユーザスレッドがまだ実行されている、まだメモリごみを発生し、それが(これは駆除できない、唯一の次のフルGCの前にクリーンアップ)「浮動ジャンク」を有していてもよいです。そのため、GCの間に、我々は、ユーザースレッドに十分なメモリを確保しておく必要があります。

だから、CMSコレクタは歳トリガーのフルGCの完全なだけではなく、半分以上を使用して(デフォルトでは68%、それは使用の2/3で使用-XX:CMSInitiatingOccupancyFractionセット)ときのフルGCが行われます。ユーザスレッドは、メモリが特に大きくない消費する場合、増加に起因し得る-XX:CMSInitiatingOccupancyFractionGCの数を削減し、性能を向上させるために。ユーザスレッド予約メモリが十分でない場合、それは並行モード・失敗をトリガーする、この時間は、代替をトリガします:シリアルオールド・コレクターを使用して収集しますが、長い休止に今回、そのため-XX:CMSInitiatingOccupancyFraction設定が高すぎるべきではありません。

そこでは、CMSを使用して标记-清除使用することができアルゴリズムはメモリの断片化につながる-XX:+UseCMSCompactAtFullCollectionのフルGCは、使用後にデフラグするかどうかを設定するために-XX:CMSFullGCsBeforeCompaction圧縮との完全なGCに何回した後、非圧縮のフルGCの実行を設定します。

並行並列

同時コレクション:

これは、ユーザスレッドとGCスレッドの実行を指す(必ずしも、平行可能交互に、一般的に同時に行われていない)、ユーザがスレッドを停止する必要がない(実際には、CMSのユーザスレッドのまま一時停止する必要があるが、非常に短い、GCスレッド別の実行CPU)で。

パラレルコレクション:

GCは、並列に複数のスレッドを意味するが、この時間は、ユーザスレッドが中断されます。

したがって、シリアルコレクタとCMSは同時であり、集電体へのシリアル、パラレル平行です。

概要

今日は普通のガベージコレクタ、および実際のゴミのアルゴリズムに共通する特徴であるCMSの詳細な説明は、前の前のクリアランスプロセスの増加は、効率がより優れているかを理解します。もちろん、それはまた、資源の消費を独自の欠点を持っているので、選択は、実際のシーンの組み合わせを必要とするとき。

私のブログをご覧いただくか、私に公共の数、見出し番号を追跡することができます興味を持っている、多分驚きがあるでしょう。

https://death00.github.io/

おすすめ

転載: www.cnblogs.com/death00/p/11774923.html