JVMの中でよくあるごみ収集アルゴリズムに基づいて紹介します。


JVMによくあるゴミ収集アルゴリズムは4つあります。
マーク-クリアアルゴリズム(Mark-Sweep)
アルゴリズムをコピーします。
マーク-整理(Mark-Comppact);
コレクション;
紹介します。
一、マーク-クリアアルゴリズム(Mark-Sweep)
これは最も基本的なごみ収集アルゴリズムで、アルゴリズムは「マーク」と「クリア」の二つの段階に分けられています。まずすべての回収対象をマークして、マークが完成したら、マークされたすべての対象をまとめて回収します。その主な欠点は二つあります。一つは効率問題で、マークとクリア効率は高くないです。もう一つは空間問題です。マークがクリアされると、大量の不連続メモリの破片が発生します。スペースの破片が多すぎると、大きなオブジェクトを割り当てる時には、大きな連続空間が足りなくなります。

マーク→クリアアルゴリズムの概略図
二、コピーアルゴリズム(Copying)
効率の問題を解決するために、「複製」のアルゴリズムがあり、利用可能メモリを同じサイズの2つのブロックに分けます。毎回一つしかないです。一つの空間がなくなったら、まだ生きている対象を別のブロックにコピーして、使ったばかりのメモリ空間を一回で整理します。このようにして、毎回その一つをメモリ回収しています。メモリの割り当て時もメモリの破片などの複雑な状況を考慮しなくてもいいです。簡単で効率的な運転を実現します。ただこのようなアルゴリズムの価格はメモリを元の半分に縮小します。価格が高すぎます。実際には、新生代のオブジェクトの98%は朝生夕方死ですので、メモリを1:1の割合で分ける必要はありません。メモリを大きなEden空間と小さいSurvivor空間に分けて、Eden空間とその中の一つのSurvisor空間を毎回使います。回収すると、EdenとSurvivorの中でまだ生きているオブジェクトを別のブロックのSuiviorに一度にコピーし、最後にEdenと先ほど使ったSurvivor空間を消去します。

コピーアルゴリズムの概略図
三、マーク-整理(Mark-Coompact)
コピー収集アルゴリズムは、オブジェクトの生存率が高いときに、より多くのコピー操作を行い、効率が低くなります。もっと重要なのは、50%の空間を無駄にしたくないなら、半分のメモリの中ですべてのオブジェクトが100%生存する極端な状況に対処するために、追加の空間が必要です。
したがって、別の「マーク-整理」というアルゴリズムが提案されています。古い年代のオブジェクトのライフサイクルが長いため、「マーク・整理」というアルゴリズムが提案されています。マーキングプロセスは「マーク・クリーンアップ」と同じですが、死んだオブジェクトを除去すると同時に生存対象を整理するので、デブリスペースを減らすことができます。

タグ-整理アルゴリズムの概略図
四、コレクション
現在の商業用仮想マシンのゴミ収集は「世代別収集」(Generation Collecting)アルゴリズムを採用しています。このようなアルゴリズムは別に新しい思想が現れていません。対象によって生存期間はいくつかのブロックに分けられています。普通はJavaヒープを新生代と古い年代に分けます。このように各年代の特徴によって最も適切な収集アルゴリズムを採用することができます。新生代の中では、ゴミ収集のたびに大量の対象者が死んでいるのを発見します。少量の生存しかないです。コピーアルゴリズムを使って、少量のコピーコストで収集ができます。年代の中で対象の生存率が高く、周期が長いため、「整理」や「マーク・クリア」のアルゴリズムで回収します。
以上のJVMに基づいて、一般的なゴミ収集アルゴリズムを紹介します。つまり、小編集は皆さんに全部の内容を共有します。