「仮想マシンの詳細な理解」リーディングノートガベージコレクター

ガベージコレクター

  • 概観
    • 接続された担当者を組み合わせることができます

    • Parallel ScanvengeとG1は従来のgcコレクターコードフレームワークを使用せず、残りはいくつかのフレームワークコードを共有します
  • 並行性と並列性
    • Parallel(Parallel):並行して動作する複数のガベージコレクションスレッドを指しますが、現時点ではユーザースレッドはまだ待機状態です。
    • 同時実行:ユーザースレッドとガベージコレクションスレッドの同時実行を指します(ただし、必ずしも並列である必要はなく、交互に実行される場合があります)。ユーザープログラムは引き続き実行され、ガベージコレクションプログラムは別のCPUで実行されます。
  • シリアルコレクター
    • 最も基本的で最も古いコレクターは、1.3.1より前の新世代コレクションの唯一のオプションです。
    • シングルスレッドコレクター:ガベージコレクションを実行するコレクションスレッドは1つだけで、他のすべてのワーカースレッドは中断する必要があります。
    • クライアントモードのデフォルトの新世代コレクターはシンプルで効率的で、シングルCPU環境に適しています。
    • シリアルコレクターのワークフローの概略図

  • ParNewコレクター
    • シリアルコレクターのマルチスレッドバージョン
      • 異なる:複数のスレッドがガベージコレクションを実行する
      • 同じ
        • 制御パラメーター:-XX:SurvivroRatio / -XX:PretenureSizeThreshold / -XX:HandlePromotionFailureなど
        • 収集アルゴリズム
        • STW
        • オブジェクト割り当てルール
        • リサイクル戦略
    • サーバーモードの新世代が優先され、CMSコレクターと組み合わせて使用​​できます。
    • -XXの後にデフォルトの新世代コレクターを使用する:UserConcMarkSweepGC、または-XX:UseParNewGCを使用して強制的に使用する
    • 単一のCPUでのパフォーマンスは、必ずしもシリアルよりも優れているわけではありませんが、CPUの数が増えるほど、GC中のシステムリソースの有効利用が向上します。
      • 開いているスレッドのデフォルト数はCPUの数と同じです
      • -XX:ParallelGCThreadsはガベージコレクションスレッドの数を制限します
    • ParNewコレクターのワークフロー図

  • パラレルスカベンジコレクター
    • レプリケーションアルゴリズムの新世代並列マルチスレッドコレクター、「スループットファースト」コレクター
    • コレクターの目標は、制御可能なスループットを達成することです(スループット=ユーザーコードの実行時間/合計CPU消費時間)
    • プログラムの計算タスクをできるだけ早く完了するためのCPU時間の効率的な使用。主に、バックグラウンド計算でやり取りを必要としないタスクに適しています。
    • 主なパラメータ
      • -XX:MaxGCPauseMills
        • ガベージコレクションの最大休止時間を制御する
        • ミリ秒が0より大きい場合、GCの一時停止時間は短縮されますが、スループットと新しい生成スペースが犠牲になります。
      • -XX:GCTimeRatio
        • スループットサイズを設定します。デフォルトは99です
        • 0より大きく100より小さい整数。つまり、総時間に対するガベージコレクション時間の比率、スループットの逆数
        • Nに設定した場合、許可される最大GC時間はN /(N + 1)です。
      • -XX:+ UseAdaptiveSizePolicy
        • GC適応規制戦略(GCエルゴノミクス)
        • 新しい世代のサイズ、新しい世代のパーティション比率、古い世代のオブジェクトのサイズなどのパラメーターを手動で設定する必要はありません。仮想マシンは、システム操作に従ってパフォーマンス監視情報を収集し、パラメーターを動的に調整して、最適な休止時間または最大スループットを提供します
        • 基本的なメモリパラメータを設定し、仮想マシンの最適化目標として-XX:MaxGCPauseMillsまたは-XX:GCTimeRatioを設定するだけです。
  • シリアル古いコレクター
    • 「マークソート」アルゴリズムを使用した、シリアルコレクターの旧世代バージョン
    • 主にクライアントモードの仮想マシンで使用
    • サーバーモードの役割
      • JDk1.5以前はParallel Scavengeコレクションで使用
      • CMSコレクターのバックアップ計画として、並行収集で並行モード障害が発生したときに使用されます。
    • 古いシリアルコレクターワークフローの概略図

  • 並列古いコレクター
    • Parallel Scavengeコレクターの旧世代バージョンは、マルチスレッドおよび「マーク編成」アルゴリズムを使用します。
    • 主にParallel Scavengeで使用されます。
  • CMS(並行マークスイープ)コレクター
    • 最短のリカバリー休止時間を得ることを目的としたコレクター。
    • 「Mark-Clear」アルゴリズムに基づいています。
    • プロセス
      • CMSコレクターのワークフローの概略図

      • 初期マーク(CMS初期マーク)-STW
        • GCルートに直接関連するオブジェクトをマークする
        • 一時停止時間が短い
      • 並行マーク(CMS並行マーク)
        • GCルーツトレース
        • 同時マーキングプロセス中、アプリケーションスレッドの継続的な操作により、一部のオブジェクトが新世代から旧世代に昇格され、一部のオブジェクト参照が旧世代に変更され、一部のオブジェクトが旧世代に直接割り当てられます。カードは、再マーキングフェーズでスキャンするためにダーティとしてマークされます。
      • プレクリーニング段階
        • 古い世代で生き残ったオブジェクトをマークするために使用される目的は、再マーキングフェーズのSTWをできるだけ短くすることです。
        • このステージの目標は、同時マーキングフェーズ中にアプリケーションスレッドの影響を受ける古い世代のオブジェクトです。これには、(1)古い世代でカードがダーティであるオブジェクト、(2)存続領域で参照される古い世代のオブジェクト(fromおよびto)が含まれます。したがって、このステージでも新世代と旧世代をスキャンする必要があります。
      • 中断可能なプレクリーニング
        • 「事前クリーニング」フェーズと同様に、再マーキングフェーズの作業負荷を軽減します。
        • 再マーキングフェーズに入る前に、マイナーGCを待って、再マーキングフェーズの一時停止時間を最小限に抑えてください。
        • また、Edenが50%に達すると、中断可能なプレクリーニングが開始されます。現時点では、次のマイナーGCからの時間はまだ半分です。これは、短時間の2つの連続した休止を回避するという別の意味もあります。
        • 次の2つの条件が満たされている場合、「中断可能な事前クリーニング」がオンになっていません
          • Edenの使用スペースは「CMSScheduleRemarkEdenSizeThreshold」より大きく、このパラメーターのデフォルト値は2Mです。
          • Edenの使用率は「CMSScheduleRemarkEdenPenetration」以上であり、このパラメーターのデフォルト値は50%です。
        • それが満たされない場合は、割り込み可能な事前クリーニングを入力します。これは複数回実行される場合があり、この段階を終了する2つの出口があります。
          • CMSMaxAbortablePrecleanLoopsが設定されており、実行数がこの値を超えている場合、このパラメーターのデフォルト値は0です。
          • CMSMaxAbortablePrecleanTime、割り込み可能な事前クリーニングを実行する時間がこの値を超えています。このパラメーターのデフォルト値は5000ミリ秒です。
        • マイナーGCを待たずに、事前クリーニングプロセスを中断することができる場合があります。この時点で再マーキングステージに入ると、新しい世代に多数のライブオブジェクトがあり、STWが長くなります。したがって、CMSはCMSScavengeBeforeRemarkパラメータも提供します。マーキングする前にマイナーGCを順番に強制します。
      • 備考(CMS備考)-STW
        • 並行マークを修正するために、ユーザープログラムの操作により変化するオブジェクトの部分のマークレコード
        • 新しい世代のオブジェクト+ Gc Roots +前面にダーティとしてマークされたカードに対応する古い世代のオブジェクト。
        • 一時停止時間は最初のマークよりわずかに長く、同時マークより短い
      • 同時スイープ(CMS同時スイープ)
    • 短所
      • CPUリソースに非常に敏感です。デフォルトで開始されるリサイクルスレッドの数は、(CPU数+ 3)/ 4です。
      • 浮遊ゴミを処理できません。
        • 別の完全なGCにつながる「並行モード障害」の障害が発生している可能性があります。
        • マーク表示後、ユーザープログラムの継続運用により、今回はリサイクルできないゴミが発生しています。
        • 予約されたメモリ領域のため、実際に使用される領域:-XX:CMSInitiatingOccupancyFraction。1.5はデフォルトの古い世代の60%で、1.6はデフォルトで92%です。
        • 予約メモリがユーザープログラムの割り当てを満たすことができない場合は、「並行モード障害」が発生し、Serial Old Collectorが一時的に起動して古い世代を収集します。
      • 多くのメモリの断片化を生成します。
        • 十分なメモリ割り当てオブジェクトが見つからない場合は、事前にフルGCがトリガーされます。
        • -XX:+ UseCMSCompactAtFullCollection
          • デフォルトでオン
          • CMSが完全なGcを保持できない場合は、メモリの断片化のマージプロセスを開始します。このプロセスは同時に実行できません。
        • -XX:CMSFullGCsBeforeCompaction
          • デフォルトは0です。つまり、フルGcが圧縮されるたびに
          • 圧縮なしでFullGcを実行する回数を設定し、圧縮ありで1回実行するために使用されます。
    • CMS並行サイクル障害
      • 並行モード障害:並行サイクルの実行中、ユーザーのスレッドはまだ実行中です。この時点で、アプリケーションスレッドによって古い世代に要求されたスペースが予約済みスペースを超える場合(保証されたエラー)、コンカレントモードエラーがトリガーされ、CMSのコンカレントサイクルがガベージコレクションのすべてのアプリケーションの完全なGC-stopに置き換えられます。そして、スペース圧縮を実行します。CMSInitiatingOccupancyFractionの値が70であるUseCMSInitiatingOccupancyOnlyおよびCMSInitiatingOccupancyFractionパラメーターを設定した場合、予約スペースは古い世代の30%です。
      • 昇格の失敗:新しい世代がマイナーなgcを実行している場合、CMSの保証メカニズムは、昇格するオブジェクトを収容するのに十分なスペースが古い世代にあるかどうかを確認する必要があります。保証メカニズムが十分でないと判断した場合、並行モードの失敗を報告します。保証メカニズムが十分であると判断した場合でも、実際、断片化の問題により、割り当てることができず、プロモーションは失敗したと報告されます。
      • 永続的な生成スペース(またはJava 8メタスペース)が使い果たされています。デフォルトでは、CMSは永続的な生成を収集しません。永続的な生成スペースがなくなると、フルGCがトリガーされます。
  • G1コレクター
    • サーバー指向のコレクター
    • 特徴
      • 並列および同時
        • マルチCPUおよびマルチコア環境のハードウェアの利点を最大限に活用します。複数のCPUを使用して、STW時間を短縮します。
        • 他のコレクターにはSTWのGCアクションが必要ですが、G1は引き続き同時に実行できます。
      • 世代別コレクション
      • 空間統合
        • 全体からは「マーク編成」に基づいており、ローカルから(リージョン間)は「コピー」アルゴリズムに基づいています。
        • 上記のアルゴリズムは、G1操作中にメモリ空間の断片化が発生しないことを意味します。
      • 予測可能な一時停止
        • ユーザーがMミリ秒の時間セグメント内で、ガベージコレクションに費やされる時間がNミリ秒を超えないことを明示的に指定できる予測可能な休止時間モデルを確立します。
    • メモリレイアウト
      • 地域
        • ヒープ領域全体が同じサイズのいくつかのメモリ領域に分割され、オブジェクト領域が割り当てられるたびに、メモリはセグメントごとに使用されます。
        • 新しい世代と古い世代の論理的な概念のみを保持し、物理的に分離されているのではなく、リージョンのコレクションです。
        • 各パーティションは特定の世代には対応せず、必要に応じて若い世代と古い世代を切り替えることができます。
        • 起動時に、パラメーター-XX:G1HeapRegionSize = nを使用して、パーティションサイズ(1MB〜32MB、2の累乗でなければならない)を指定できます。デフォルトでは、ヒープ全体が2048個のパーティションに分割されます。
      • カード
        • 各パーティションは512バイトのカードに分割され、ヒープメモリの最小の利用可能な粒度を識別するカードがグローバルカードテーブルに記録されます。
        • 割り当てられたオブジェクトは、物理的に連続しているいくつかのカードを占有します。
        • パーティション内のオブジェクトへの参照を検索する場合、カードを記録することで参照オブジェクトを見つけることができます(RSetを参照)。
        • メモリがリサイクルされるたびに、指定されたパーティションのカードが処理されます。
    • 予測可能な時間モデルの基礎
      • ヒープ全体で全領域のガベージスキャンを回避するように計画できます。
      • G1は各リージョンの値と累積値(回収されたスペースとリサイクルに必要な時間の経験値)を追跡し、優先リストを維持し、許可された収集時間に従って最高値を持つリージョンに優先順位を付けます。
    • 集めたセット
      • リサイクルできるパーティションのコレクション。CSetで存続するデータは、GC中に使用可能な別のパーティションに移動されます。CSetのパーティションは、Edenスペース、Survivorスペース、または古い世代から取得できます。CSetは、ヒープ領域全体の1%未満を占有します。
    • 記憶セット-フルヒープスキャンを回避
      • 各リージョンには記憶セットがあります。
      • JVM検出プログラムが参照タイプのデータを書き込むと、書き込みバリアが生成され、書き込み操作が一時的に中断され、参照されたオブジェクトが別のリージョンにあるかどうかが確認されます。
      • そうである場合、関連する参照情報は、CardTableを介して、参照されるオブジェクトが属する領域の記憶セットに記録されます。
      • ガベージコレクションを実行する場合は、GCルートノードの列挙範囲に記憶セットを追加して、フルヒープスキャンを回避します。
      • RSetは実際にはハッシュテーブルであり、キーは別の領域の開始アドレス、値はセット、内部の要素はカードテーブルのインデックスです。
    • 最初のスナップショット(SATB)
      • SATBは、コンカレントGCの正確性を維持するための手段です。G1GCの同時実行理論はSATBに基づいています。これは、湯浅泰一が増分マーク削除ガベージコレクタのために設計したマーキングアルゴリズムです。SA​​TABのマーク最適化は主にマーク削除ガベージコレクタ用です同時マーキングフェーズ。Rの主張によれば、CMSのインクリメンタル更新設計では、リマークフェーズ中にすべてのスレッドスタックと若いgen全体をrootとして再スキャンする必要があります。G1のSATBデザインは、リマークフェーズ中に残りのsatb_mark_queueをスキャンするだけで済みます。
      • SATBアルゴリズムは、ヒープの論理的な「スナップショット」であるオブジェクトグラフを作成します。タグのデータ構造には、前のビットマップと次のビットマップの2つのビットマップが含まれています。
      • 前のビットマップは、最後に完了したマーキング情報を保存します。次のビットマップは、同時マーキングサイクルで作成および更新されます。時間が経過すると、前のビットマップはますます古くなります。最後に、同時マーキングサイクルの最後に、次のビットマップ以前のビットマップを上書きします。
      • 手順
        • 同時実行サイクルには、初期マーキング、同時マーキング、最終マーキングが含まれます。
        • 最初のマーキングフェーズ中に、NTAMSフィールドは各パーティションの現在の先頭に設定されます。並行サイクルの開始後、割り当てられたオブジェクトはTAMSに配置され、暗黙的に生存しているオブジェクトとして明示的に定義されますが、TAMSの下のオブジェクトは明確にマークする必要があります。
        • 上下にPTAMSポインターがあります。これは、前のマーキングサイクルの終了時に暗黙的に有効であることを示し、次のサイクルで明確にマークする必要があるオブジェクト領域の位置、つまり前のマーキングサイクルの終了時のNTAMSの位置を示します。
        • 並行サイクルが始まると、BottomとPTAMSの間で明確にマークする必要があるオブジェクトの領域が、前のビットマップに記録されます。
        • TopとPATMSの間のオブジェクトは、暗黙的に存続するオブジェクトであり、以前のビットマップにも記録されます。
        • 最終マーキングの最後に、NTAMSより前のすべてのオブジェクトがマーキングされます。
        • 同時マーキングフェーズ中に割り当てられたオブジェクトは、NTAMSの後にスペースに割り当てられ、次のビットマップで暗黙的に存続するオブジェクトとして記録されます。同時マーキングサイクルが完了すると、この次のビットマップは前のビットマップを上書きし、次のビットマップをクリアします。
    • 手順
      • イニシャルマーク(STW)-STW
        • GC Rootsに直接関連付けられているオブジェクトをマークし、NTAMSフィールド(Mark StartのNext Top)を現在のパーティションの最上位に変更します。
        • 一時停止時間が短い
      • 同時マーク
        • GCルーツトレース
        • 同時マーキングでは、トレースアルゴリズムを使用してすべての生存オブジェクトを検索し、それらをビットマップに記録します。これは、TAMSより上のオブジェクトは暗黙的に生存していると見なされるため、TAMSの下のオブジェクトのみをトラバースする必要があるためです。
        • マーキング時に発生した参照の変更を記録するために、SATBの考え方は、最初にスナップショットを設定し、スナップショットが変更されないと想定し、このスナップショットに従ってトレースすることです。
        • このとき、オブジェクトの参照が変更された場合は、オブジェクトの古い値を、書き込み前のバリアログを通じてSATBバッファに記録する必要があります。
        • バッファーがいっぱいの場合は、それをグローバルリストに追加します。G1は同時にマークされたスレッドでグローバルリストを定期的に処理します。
      • 最終マーク(Finalremark)STW
        • 並行マークを修正するために、ユーザープログラムの操作によってマークが変更されるオブジェクトの部分のマークレコード。
        • G1ガベージコレクターは、残りのSATBログバッファーとすべての更新された参照を破棄すると同時に、マークされていないすべてのライブオブジェクトも検出します。
        • JVMは、期間中のオブジェクトの変更をスレッドの記憶セットログに記録します。最後に記憶セットにマージされました。
      • スクリーニングとリサイクル(ライブデータのカウントと避難)、
        • まず、地域のリサイクル価値とコストに従って分類し、ユーザーが予想するGCの一時停止時間に従ってリサイクル計画を作成します。
        • 同時実行は許可されますが、リージョンの一部のみが回復されるため、時間はユーザーが制御でき、ユーザースレッドを一時停止すると収集効率を大幅に向上できます。
    • ガベージコレクター関連パラメーター
元の記事を24件公開 Likes0 Visits100

おすすめ

転載: blog.csdn.net/jiangxiayouyu/article/details/105614266
おすすめ