Java仮想マシン学習ノートを深く理解する:第三章、ゴミ収集器


第三章ごみ収集器
概要
一、概説
1.ゴミ収集器(GC)で考えるべき3つのこと:
            ?
          ?
        ?

2.Javaメモリ実行データ領域では、プログラムカウンタ、仮想マシンスタック、ローカルメソッドスタック、3つの領域がスレッドの宣言周期と同じである.メソッドが終了したり、スレッドが終了したりすると、メモリが回収されます.Javaスタックとメソッド領域は異なり、プログラムが実行中である場合にのみ、それらのオブジェクトの作成がわかります.このメモリの割り当てと回収は動的です.ゴミ収集器が注目しているのはこの部分です.
二、対象が死亡したとどう判断するか
                ,                。

1.参照カウントアルゴリズム:(1)オブジェクトに参照カウンタを追加し、1つの場所が参照されるたびにカウンタ値に1を追加する.参照が無効になると、カウンタの値は1減少します.カウンタが0のオブジェクトはいつでも使用できません.(2)利点:実現が簡単で判定効率が高い.(3)欠点:オブジェクト間の相互参照の問題を解決することは困難である.2.可達性分析アルゴリズム:(1)一連の「GC Roots」のオブジェクトを始点として、これらのノードから下へ検索を開始し、通過した経路を参照チェーンと呼び、1つのオブジェクトからGC Rootsまで何の参照もない場合、GC Rootsからこのオブジェクトまで不可であり、オブジェクトが使用できないことを証明する.(2)GC Rootsオブジェクトは以下のものを含む.
        (         )      。
                  。
               。
          JNI(     Native  )     。

(3)引用:JDK 1.2以降、引用の概念を拡張し、引用を強引用(Strong Reference)、ソフト引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)の4種類に分けた.
                      ,       ,GC              。
           “Object obj = new Object()”     。
                        。              ,       。
                       ,          。
        SoftReference       。
                  。             GC    。  GC  ,       。
        WeakReference       。
                   ,         。
        PhantomReference       。

(4)可達性解析アルゴリズムにおいて、不可達オブジェクトは、実際に回収されるまで少なくとも2回のマーキングプロセスを経なければならないと判断する.最初はGC Rootsリファレンスチェーンに接続されていない解析であり、最初にマークされ、フィルタリングされます.オブジェクトがfinalize()メソッドを実行する必要があるかどうかを判断します.
            finalize  ,   finalize       ,            “      。”
           finalize        。

(5)回収方法エリア.メソッド領域は主に2つの部分の内容を回収し,廃棄定数と不要なクラスを含む.
             Java        ,          。         。
           (  )、  、            。
                  :
                     ,Java            。
             ClassLoader     。
             java.lang.Class            ,                   。

三、ゴミ収集アルゴリズム
1.タグ-クリアアルゴリズム(1)思想:まず、クリーンアップするすべてのオブジェクトをマークし、マークが完了した後、マークされたすべてのオブジェクトを統一的に回収する.(2)不足:
        :               。
        :                  。
        PS:                                               。

2.コピーアルゴリズム(1)タグクリアアルゴリズムの効率問題を解決する.(2)適用シーン:新生代GC、新生代の特徴、対象生存時間が短く、生存率が低く、回収率が高い.(3)思想:メモリを大きさの等しい2つに分割し,生きているオブジェクトを毎回別のメモリにコピーする.残りの半分を片付けます(4)実際のメモリ分割:IBM社の研究によると、98%の対象は朝生夕死であるため、メモリ空間を1:1で割り当てる必要はない.メモリ領域を大きな空間Eden領域と小さな空間Survivor領域の2つに分けるだけです.HotSpot仮想マシンのデフォルトEden領域とSurvivor領域のサイズの割合は8:1で、つまり新生代の80%の空間が使用されます.(5)アルゴリズムをコピーする場合、メモリが不足する:Edenと1つのSurvivor領域のオブジェクトをもう半分のSurvivor領域にコピーし、もう半分のSurvivorメモリが不足する場合、割り当て保証によって他のメモリに入る(ここでは古い年代を指す)
3.タグ-整理アルゴリズム(1)タグ-消去アルゴリズムのメモリフラグメント生成の問題を解決する.(2)適用シーン:旧年代GC、旧年代の特徴、対象生存率が高く、余分な空間がない.(3)思想:メモリの中のオブジェクトをマークし,生きているオブジェクトを一端に移動し,端境界以外のメモリを直接消去する.
4.現代のビジネス仮想マシンの多くは「世代別収集アルゴリズム」を採用しており、対象の生存周期によってメモリをいくつかの領域に分け、一般的に新生代と古い年代を指す.応答の収集アルゴリズムは、異なる領域の特性に基づいて構成される.
四、HotSpotのアルゴリズム実現
1.ルートノードの列挙:一貫性を保証するスナップショットで実行する必要がある達成性分析.ルートノードを列挙するには停止が必要です.
2.精確式GC:仮想マシンはどの位置にどのようなデータが記録されているかを知ることができる.HotSpot実装では、この目的を達成するために、OpMapと呼ばれるデータ構造のセットが使用される.
3.安全点:OopMapの協力で書くと、HotSpotはGC Rootsの列挙を迅速かつ正確に完成することができるが、現実的な問題は、OopMapの内容変化命令が非常に多く、各命令に対して1つのOopMapを生成するには大量の余分な空間が必要であり、このようにGCの空間コストが非常に高いことである.実際、OpMapでは、これらの情報は特定の場所にのみ記録されます.これらの場所は「セキュリティポイント」と呼ばれ、プログラムがここまで実行されてもオブジェクトの参照関係が変化しません.
4.GC発生時にスレッドを安全点まで走らせて停止させる方法.2つの方法があります.それぞれ切断式中断とアクティブ式中断です.切断式中断とは、GCが発生したときにすべてのスレッドをすべて中断し、セキュリティポイントに達していないスレッドが回復してセキュリティポイントに走ることを意味します.アクティブ割り込みとは、すべてのスレッドがこのフラグをポーリングするようにフラグを設定することであり、ポーリングフラグとセキュリティポイントが一致し、ポーリングフラグ内のスレッドが自分で中断していると判断します.現在のHotSpotはアクティブ割り込みを使用しています.
5.安全区域とは、オブジェクトの参照が変化しない区域を指す.
五、ゴミ収集器
          、         。

1、Serialコレクター:Serialコレクターは最も基本的で、発展の歴史が最も長いコレクターである.これは単一スレッドコレクタです.1つのCPUまたは1つの収集スレッドのみを使用してゴミ収集作業を完了し、ゴミ収集中に仮想マシン内の他のスレッドを一時停止し、スレッド収集の完了を待つ必要があります.利点:簡単で効率的な欠点:停止アルゴリズムが必要:新生代は複製アルゴリズムを採用し、古い年代はマーク-整理アルゴリズムを採用した.使用シーン:仮想マシンClientモードでデフォルトの新生代コレクター.
2、parNewコレクター:ParNewはSerialのマルチスレッドバージョンです.マルチスレッド収集を使用する以外は、Serialと何の違いもありません.利点:簡単で効率的な欠点:停止アルゴリズムが必要:新生代は複製アルゴリズムを採用し、古い年代はマーク-整理アルゴリズムを採用した.≪シーンの使用|Use Scene|emdw≫:仮想マシン・サーバー・モードでデフォルトの新生代コレクター.CMSコレクターに合わせて動作できる唯一のゴミコレクターです.
3、Parallel Scavengeコレクター:マルチスレッドプロセッサ、スループット優先.スループットとは、CPUがユーザコードを実行するための時間とCPUの総消費時間との比である.すなわち、スループット=ユーザコードを実行する時間/(ユーザコードを実行する時間+ゴミ収集時間)である.提供-X:MaxGCPauseMilisは、最大のゴミ収集停止時間を制御します.-X:GCTimeRatioを使用して、合計時間に対するGC時間の比率を制御します.-X:UseAdaptiveSizePolicyを使用してGC適応調整ポリシーを提供します.利点:ゴミ収集時間のスループットを制御できる.欠点:効率が比較的低い.アルゴリズム:新生代は複製アルゴリズムを採用し、古い年代はマーク-整理アルゴリズムを採用した.シーンの使用:バックグラウンド演算に適しており、あまりインタラクティブなタスクは必要ありません.
4、Serial Oldコレクター:Serialの古い年代バージョンで、単一スレッドコレクターで、タグ-整理アルゴリズムを使用します.CMSコレクターのバックアップとして、携帯電話でConcurrent Mode Failureが発生した場合に使用できます.
5、Parallel Oldコレクター:Parallel OldはParallel Scavengeコレクターの古い年代バージョンで、マルチスレッドコレクターで、タグ-整理アルゴリズムを使用する.スループット優先の原則.
6.CMSコレクター:CMS(Concurrent Mark Sweep)コレクターは、回収停止時間の最短化を目指すコレクターである.タグ-消去アルゴリズムを使用します.プロセス全体で4つのステップが必要です.
        :  “Stop The World”,    GC Roots         ,    。
        :   GC Roots Tracing   。
        :  “Stop The World”,        ,                        。      ,       。
        :                。

収集プロセス全体で最も時間がかかる2つの部分により、同時タグおよびタグクリアはユーザースレッドとともに実行できるため、CMSコレクタはユーザースレッドとともに実行されると見なすことができる.
  :    、   。
  :
    1、 CPU      。        (CPU   + 3)/ 4 。CPU    ,CMS          。
    2、        。    “ConCurrent Mode Failure”        Full GC   。
    3、  -           。

7、G 1コレクター:サーバ側アプリケーション向けのゴミ処理装置.全体的にタグ−整理アルゴリズムを用い,局所的には複製アルゴリズムに基づいて実現した.
G1                :
1、     :     CPU        ,     。
2、    :G1         ,         。
3、    :      -    ,        。         。
4、      :           ,          。

G 1コレクタは、スタック全体を同じ大きさの複数の独立した領域(Region)に分割し、各Regionの回収価値(回収によって得られる空間の大きさおよび回収に要する時間によって決定される)を追跡記録するための優先リストを維持し、許可された時間ごとに最も優先回収価値の大きいRegion(これがGarbage-First名の由来である)を維持する.
仮想マシンは,G 1コレクタがRegionまたは他のコレクタのすべてをスキャンすることを防止するために,新生代および旧世代をスキャンする.G 1のRegionのオブジェクト参照および他のコレクタの新世代と旧世代のオブジェクト参照は、仮想マシンがRemembered Set(RSet)を使用してスタックスキャンを回避します.
G1        :
1、    :    GC Roots         。
2、    : GC Roots         。
3、    :                     。
4、    :  Region              。