詳細なガベージコレクションアルゴリズム--- Java仮想マシン



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

JVMがオブジェクトを生成した後、「デッド」とマークされたオブジェクトをリサイクルする必要があります。オブジェクトが「デッド」であるかどうかを判断する観点から、ガベージコレクションアルゴリズムは「参照カウントガベージコレクション」と「トレースガベージ」に分けることができます。 Reclamation(Tracing GC) "。しかし、ほとんどのJVMは、オブジェクトが死んでいるかどうかを判断するために参照カウントアルゴリズムを使用しないことも以前に学びました。したがって、JVMは主に追跡ガベージコレクションアルゴリズムを使用します。ただし、追跡ガベージコレクションアルゴリズムは次の理論に従うためです。 「世代別リサイクル」を設計しているため、世代別仮説を理解する必要があります。

1.世代別収集理論

JVM内のほとんどのオブジェクトは昼夜を問わず絶滅していますが、オブジェクトが多くのガベージコレクションを「存続」して存続する場合、それは死ぬのが難しいことを意味します。したがって、JVMはヒープ内のオブジェクトを2つのカテゴリに分類します。若い世代のオブジェクトヒープは2つの領域に分割され、2種類のオブジェクトを格納します。若い世代(若い世代古い世代)。異なる領域に応じて。GCは2つの部分に基づくことができます。異なる機能は別々に収集されます。ただし、単にヒープメモリを2つの分割された部分として扱うと、問題が発生する可能性があります。
たとえば、若い世代のみを対象とするMinorGCに来た場合、若い世代のオブジェクトが古い世代の影響を受ける場合、オブジェクトは両方を参照します。世代間参照(ただし、これは非常にまれです)の場合、固定されたGCルートの外部があり、新世代のオブジェクトの場合は世代間参照が生成されるため到達可能性分析の正確を検証するための古い検索全体があります。古い世代のオブジェクトは難しいため破壊するために、新世代のオブジェクトも破壊するのが難しくなります。

これに対する解決策もあります。つまり、新世代の領域グローバルデータ構造(メモリセットを確立して、旧世代をいくつかの部分に分割し、旧世代のどの部分が世代間参照を生成するかを記録します。その後、MinorGCが実行されると、旧世代で世代間参照を生成する部分も到達可能性分析に追加されます。

GCは、さまざまな領域のガベージコレクションを実行できます。

  • マイナーGC /ヤングGC(新世代コレクション):新世代のために収集します。
  • メジャーGC /オールドGC(オールドGC):旧世代のコレクションのみ。現在、CMSコレクターのみがそのような動作をします。
  • 混合GC(混合コレクション):若い世代全体と古い世代の一部を収集します。現在、G1コレクターのみがそのような動作をします。
  • フルGC(コレクション全体):Javaヒープとメソッド領域全体を収集します

2. Mark-Sweepアルゴリズム(Mark-Sweep)

マーク除去アルゴリズムは、最も初期の最も基本的なGCアルゴリズムです。名前が示すように、このアルゴリズムは、マークとスイープの2つのステップに分かれています。最初にクリアする必要のあるすべてのオブジェクトにマークを付け、次にマークされたオブジェクトを均一にリサイクルします。これアルゴリズムはシンプルで理解しやすいですが、多くの欠点があります。

  • ほとんどの場合、効率は低くなります。Javaヒープ内のほとんどのオブジェクトを昼夜を問わず収集する必要があるため、多くのマーキングとクリーニングが必要になります。クリーニングする必要のあるオブジェクトが多いほど、効率は低下します。
  • メモリスペースの断片化問題:ヒープメモリ内のスペースを収集した後、大量の不連続スペース(断片化)が生成されます。これは、大きなオブジェクトが割り当てられる場合、将来につながります。ヒープは十分ですが、断片化のため、割り当てるための十分な連続スペースがありません

マーク除去アルゴリズムの概略図:
ここに画像の説明を挿入

3.マーク-コピー-新世代に適しています

マークコピーアルゴリズムは、コピーアルゴリズムと呼ばれます。

3.1初期段階

アルゴリズムの断片化の欠点にタグを付けて排除することを目的とした研究者。別のアルゴリズム-セミスペースコピー(セミスペースコピー)セミスペースコピーアルゴリズムはメモリ領域を半分に分割します。半分はメモリの割り当てに使用され、残りの半分はストレージ。生き残ったオブジェクト。

ここに画像の説明を挿入

ハーフエリアコピーの具体的な操作は次のとおりです。一方のハーフエリアでGCを生き残ったオブジェクトをもう一方のハーフエリアにコピーし、順番に配置します。メモリ内のほとんどのオブジェクトがリサイクルされる場合、オブジェクトのごく一部のみがリサイクルされます。コピーする必要があります。

したがって、この種のアルゴリズムは新世代に適していますが、この種のアルゴリズムには致命的な欠点があります。スペースの浪費が大きすぎて、スペースの50%をメモリの割り当てに使用できないということです。改善点はありますか?

3.2最適化

ハーフエリアレプリケーションアルゴリズムと新時代の特徴に基づいて、研究者たちは「アペルリサイクル」と呼ばれるより最適化されたアルゴリズムを提案しました。それではどのように最適化されますか?新世代は絶滅しているため、ほとんどのオブジェクトはまもなく消滅します。回復し、あなたはそれを生き残るストアオブジェクトに半分のスペースを使用する必要があります?

したがって、アペルリサイクルの具体的な戦略は、新しい世代は、もはや単にと概ね二つの等しい領域に分割されていない、より大きなエデンスペース(80%)と2つの小さなサバイバースペース(合計20%)に。各割当用途エデンとサバイバースペースの一部のみ。ガベージコレクションが発生すると、割り当てられたスペースにまだ生きているオブジェクトが一度に別のサバイバースペースにコピーされるため、サバイバーエリアは1つ(10%)しか無駄になりません。 。

Appelアルゴリズム図:
ここに画像の説明を挿入

しかし、これも少し問題を引き起こす可能性があります。新世代のオブジェクトの98%はガベージコレクションの最初のラウンド(IBMが調査)に耐えられませんが、100%を保証することはできず、各コレクションは10%を超えません。オブジェクトは存続します。存続するオブジェクトのメモリがサバイバー領域よりも大きい場合、サバイバー領域が十分でない場合はどうすればよいですか?Appelアルゴリズムは安全性を保証します。ただし、サバイバースペースはオブジェクトを格納するのに十分ではありません。マイナーリカバリを生き延びた後、割り当ての保証を他のメモリ領域(実際にはほとんどの場合は古い世代)に依存します(ハンドルプロモーション)

4.Mark-Compactアルゴリズムは老後期に適しています

マークコピーアルゴリズムは、生き残った物体がほとんどない新生代の地域に非常に適していますが、老年期には適用できなくなりました。老年期のすべての特性が保持されます。1974年に、研究者はターゲットアルゴリズムを提案しました- 「Mark-Mark-Compact(Mark-Compact)」。

マークソートアルゴリズムのマーキングプロセスは、マーククリアアルゴリズムと同じですが、後続のステップは直接再利用されません。代わりに、すべての存続オブジェクトがメモリのセクションに移動され、存続境界外のすべてのオブジェクトがクリアされます。次のようなアルゴリズム図:

ここに画像の説明を挿入

マークスイープアルゴリズムとマークソートアルゴリズムの本質的な違いは、前者は非モバイルリサイクルアルゴリズムであり、後者はモバイルであるということです。生存後にオブジェクトを移動するかどうかは、長所と短所の両方を伴う危険な決定です。。オブジェクト、特に老後の多数のオブジェクトを移動するため、非常に面倒な操作です。

4.2別の考え方

さらに、「そして薄い泥」の解決策があります。仮想マシンにマークアンドスイープアルゴリズムをほとんどの時間使用させ、メモリ内の断片化の程度がメモリに達するまで、一時的にメモリ断片化の存在を許容します。オブジェクトに影響を与える割り当て。次に、タグの最適化アルゴリズムを使用して、スペースフラグメントを1回整理します。

おすすめ

転載: blog.csdn.net/qq_44823898/article/details/109843429