JVMには4つの一般的なガベージコレクションアルゴリズムがあります。
マーククリアリングアルゴリズム(Mark-Sweep);
コピーアルゴリズム(コピー);
マークコンパクト;
世代コレクション;
一つずつ紹介しましょう:
1。マーククリアリングアルゴリズム(マークスイープ)
これは、最も基本的なごみ収集アルゴリズムです。アルゴリズムは、「マーキング」と「クリアリング」の2つの段階に分割されます。まず、リサイクルする必要があるすべてのオブジェクトがマークされ、マーキングが完了した後にすべてのマークされたオブジェクトが均一にリサイクルされます。その主な欠点は2つです。1つは効率の問題であり、マーキングとクリーニングの効率は高くありません。もう1つはスペースの問題です。マーキングがクリアされた後、多数の不連続なメモリフラグメントが生成されます。スペースフラグメントが多すぎると、大きなオブジェクトを割り当てるときに大きな連続スペースが不十分になる可能性があり、別のゴミ収集アクションを事前にトリガーする必要があります。
マーククリアアルゴリズム図
2。コピーアルゴリズム(コピー)
「コピー」アルゴリズムを使用して、効率の問題を解決するために、使用可能なメモリを同じサイズの2つのブロックに分割します。一度に1つのピースのみを使用します。 1つのスペースが使い果たされる場合は、まだ生存しているオブジェクトを別のピースにコピーしてから、一度に新しく使用されたメモリスペースをクリーンアップします。これにより、メモリの断片化やその他の複雑な状況を、メモリを割り当てるときに考慮する必要はありません。簡単な実装と効率的な操作。しかし、このアルゴリズムのコストは、メモリを元の半分に減らすことです。これは少し高すぎます。実際、新世代のオブジェクトの98%が生きて死にます。そのため、メモリを1:1の比率で分割する必要はありませんが、メモリをより大きなエデン空間と2つの小さな生存空間に分割する必要はありません。リサイクルしたら、エデンとサバイバーのまだ生存しているオブジェクトを一度に別の訴訟にコピーし、最終的にエデンと新しく使用された生存者のスペースをきれいにします。
アルゴリズム図をコピーします
3。マークコンパクト
オブジェクトの生存率が高い場合、複製およびコレクションアルゴリズムはより多くの複製操作を実行する必要があり、効率が低くなります。さらに重要なことは、スペースの50%を無駄にしたくない場合は、ハーフゾーンメモリ内のすべてのオブジェクトが100%生きている極端な状況に対処するために保証を割り当てるための追加スペースが必要であるため、このアルゴリズムは高齢者で直接使用できません。
したがって、人々は別の「マークコンパクト」アルゴリズムを提案しました。高齢者のオブジェクトには生存サイクルが長いため、一部の人々は「マークコンパクト」アルゴリズムを提案しました。マーキングプロセスは「マーククリーニング」と同じですが、死んだオブジェクトをクリアしている間、存在するオブジェクトは整理され、断片化された空間を減らすことができます。
マーク - 組織化アルゴリズム図
4。世代コレクション
現在、商用仮想マシンのガベージコレクションは、「世代コレクション」アルゴリズムを採用しています。このアルゴリズムには新しいアイデアはありませんが、オブジェクトの異なるサバイバルサイクルに従ってメモリはいくつかのピースに分割されます。一般に、Javaヒープは新世代と古い世代に分割されるため、各世代の特性に従って最も適切なコレクションアルゴリズムを使用できます。新世代では、ごみ収集が収集されるたびに、多数のオブジェクトが死んでいることがわかり、少数のみが生き残ります。次に、コピーアルゴリズムを使用すると、コレクションを少量のコピーコストで完了できます。高齢者では、オブジェクトの生存率が高く、サイクルが長いため、「マークチディ」または「マーククリア」アルゴリズムが使用されてリサイクルされます。
JVMの一般的なガベージコレクションアルゴリズムの上記の紹介は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。