JVM シリーズ 3 -- ガベージ コレクションとアルゴリズム

  1. ゴミの見分け方
    1. 参照カウント
              Java では、参照とオブジェクトは関連付けられています。オブジェクトを操作したい場合は、参照を使用する必要があります。したがって、参照カウントを使用してオブジェクトをリサイクルできるかどうかを判断するのが簡単な方法であることは明らかです。簡単に言うと、オブジェクトに関連付けられた参照がない場合、つまり参照カウントが 0 でない場合、そのオブジェクトが再度使用される可能性が低いことを意味し、そのオブジェクトはリサイクル可能なオブジェクトです。
    2. アクセシビリティ分析
              参照カウント方式の循環参照問題を解決するために、Java では到達可能性解析方式を使用します。開始点として、一連の「GC ルート」オブジェクトを検索します。「GC ルート」とオブジェクトの間に到達可能なパスがない場合、オブジェクトは到達不能であると言われます。到達不能オブジェクトはリサイクル可能オブジェクトと同等ではないことに注意してください。到達不能オブジェクトがリサイクル可能オブジェクトになるには、少なくとも 2 つのマーキング プロセスを経る必要があります。2 回マークされた後でもリサイクル可能なオブジェクトである場合は、リサイクルの対象となります。
  2. マーク スイープ アルゴリズム (マークスイープ)

    この図から、このアルゴリズムの最大の問題は深刻なメモリの断片化であり、その後、大きなオブジェクトが利用可能なスペースを見つけられないという問題が発生する可能性があることがわかります。
     

    1. 最も基本的なガベージ コレクション アルゴリズムは、マーキングとクリアの 2 つの段階に分かれています。マーキング フェーズでは、リサイクルする必要があるすべてのオブジェクトにマークを付け、クリーニング フェーズでは、マークされたオブジェクトが占めていたスペースを再利用します。写真に示すように
  3. コピーアルゴリズム (コピー)

           マークスイープアルゴリズムのメモリ断片化欠陥を解決するために提案されたアルゴリズム。メモリ容量に応じてメモリを同じサイズの 2 つのブロックに分割します。一度に 1 つのブロックのみを使用してください。メモリのこのブロックがいっぱいになったら、図に示すように、残っているオブジェクトを別のブロックにコピーし、使用されているメモリをクリアします。

    このアルゴリズムは実装が簡単で、メモリ効率が高く、断片化が起こりにくいですが、最大の問題は、使用可能なメモリが元のサイズの半分に圧縮されてしまうことです。また、生き残るオブジェクトの数が増えると、コピー アルゴリズムの効率が大幅に低下します。

  4. マークコンパクトアルゴリズム (Mark-Compact)

    欠陥を回避するために、上記 2 つのアルゴリズムの組み合わせが提案されています。マーキング フェーズはマーク スイープ アルゴリズムと同じで、マーキング後、オブジェクトはクリーンアップされませんが、残ったオブジェクトはメモリの一端に移動されます。次に、終了境界の外側にあるオブジェクトを消去します。図に示すように:
  5. 世代別収集アルゴリズム
    1. 世代別コレクション メソッドは、現在、ほとんどの JVM で使用されています。その中心的な考え方は、オブジェクトのさまざまなライフ サイクルに従ってメモリをさまざまなドメインに分割することです。一般に、GC ヒープは Tenured/Old Generation と Young Generation に分割されます。旧世代の特徴は、各ガベージ コレクションでリサイクルする必要があるオブジェクトの数が少ないことですが、新世代の特徴は、各ガベージ コレクションで大量のガベージをリサイクルする必要があることです。そのため、異なるアルゴリズムを使用できます。さまざまな領域に応じて選択できます。
    2. 新しい世代とレプリケーションのアルゴリズム

      現在、ほとんどの JVM GC は新しい世代にコピー アルゴリズムを採用しています。これは、ほとんどのオブジェクトが新しい世代の各ガベージ コレクション中に回復される必要があるためです。つまり、コピー操作が比較的少ないためですが、通常、新しい世代は次のように分割されません。 1:1。一般に、新しい世代は、より大きな Eden スペースと 2 つの小さな Survivor スペース (From Space、To Space) に分割され、Eden スペースと Survivor スペースの一部が使用されるたびに、リサイクルが実行されると、2 つのスペースは生き残ったオブジェクトになります。別の Survivor スペースにコピーされます。
    3. 旧世代およびマークされたレプリケーション アルゴリズム
       

      古い世代では、毎回少数のオブジェクトのみをリサイクルするため、Mark-Compact アルゴリズムが使用されます。

      1. JAVA 仮想マシンによって言及されるメソッド領域の永続世代 (Permanet Generation) は、クラス、定数、メソッドの説明などを格納するために使用されます。永遠世代のリサイクルには、主に破棄された定数と不要なクラスが含まれます。

      2. オブジェクトのメモリ割り当ては主に新世代の Eden スペースと Survivor スペースの From Space (Survivor が現在オブジェクトを格納しているブロック) にありますが、場合によっては旧世代に直接割り当てられることもあります。 。

      3. 新世代の Eden Space と From Space が不足した場合、GC が発生し、GC 終了後、Eden Space および From Space 領域に残っているオブジェクトが To Space に移動され、さらに Eden Space および From Space が移動されます。空間がすっきりします。

      4. To Space がオブジェクトを十分に保存できない場合、オブジェクトは古い世代に保存されます。

      5. GC 後、Eden Space と To Space が使用され、このサイクルが繰り返されます。

      6. オブジェクトが Survivor エリアの GC から脱出すると、そのオブジェクトの年齢は +1 されます。デフォルトでは、年齢が 15 に達したオブジェクトは古い世代に移動されます。

        

おすすめ

転載: blog.csdn.net/weixin_38340874/article/details/122082316