コピー アルゴリズム
まず、コピー アルゴリズムの実践を見てみましょう。コピー アルゴリズムは、メモリを 2 つの間隔に分割します。どの時点でも、動的に割り当てられたすべてのオブジェクトはいずれかの間隔 (と呼ばれます) にのみ割り当てられます。アクティブ インターバル) ですが、他のインターバル (フリー インターバルと呼ばれる) は空いています。
有効なメモリ空間が使い果たされると、JVM はプログラムを一時停止し、コピー アルゴリズムの GC スレッドを開始します。次に、GC スレッドは、アクティブ区間内のすべての生き残ったオブジェクトを空き区間にコピーし、メモリ アドレスに従って厳密に配置します。同時に、GC スレッドは、生き残ったオブジェクトのメモリ参照アドレスをポイントするように更新します。新しいメモリアドレスに。
この時点で、空き間隔はアクティブな間隔と交換され、すべてのガベージ オブジェクトは元のアクティブな間隔、つまり現在の空き間隔に残ります。実際、アクティブ間隔がスペース間隔に変換されると、ガベージ オブジェクトが一度にリサイクルされます。
複雑に聞こえますか?
実際、前の章の基礎があれば、このアルゴリズムを理解するのにそれほどの労力はかからないと思います。 LZ は、以下に示すように、問題を説明するための図を描画します。
実際、この図はまだ前の章の例ですが、コピー アルゴリズムによってメモリが 2 つの部分に分割されています。 の GC スレッド後に 2 つの領域がどのように見えるかを見てみましょう。コピーアルゴリズムは次のように処理されます。
オブジェクト 1 と 4 がクリアされ、オブジェクト 2、3、5、6 が、現在のアクティブな間隔である先ほどの空き間隔に規則的に配置されていることがわかります。この時点で左半分はアイドル区間となっているが、次のGC以降は再び左半分がアクティブ区間となることは想像に難くない。
明らかに、コピー アルゴリズムは、マーク/クリア アルゴリズムの混沌としたメモリ レイアウトの欠点を補います。しかし同時に、その欠点も明らかです。
1. メモリの半分が無駄になります。これはひどいことです。
2. オブジェクトの生存率が非常に高い場合は、100% 生存すると仮定して、すべてのオブジェクトをコピーし、すべての参照アドレスをリセットする必要があります。この作品のコピーに費やされる時間は、オブジェクトの生存率が一定のレベルに達すると無視できなくなります。
したがって、上記の説明から、複製アルゴリズムを使用するには、少なくともオブジェクトの生存率が非常に低くなければならず、最も重要なことは、オブジェクトの 50% の無駄を克服する必要があることを理解するのは難しくありません。メモリ。
マーク/照合アルゴリズム
マーク/照合アルゴリズムは、マーク/クリア アルゴリズムと非常によく似ており、マークと並べ替えの 2 つの段階に分かれています。次に、LZ はこれら 2 つの段階で何が行われたかを紹介します。
マーキング: 最初のフェーズはマーク/クリア アルゴリズムとまったく同じで、GC ルートを走査し、生き残ったオブジェクトをマークします。
編成: 残っているすべてのオブジェクトを移動し、メモリ アドレスの順に並べてから、終了メモリ アドレス以降のすべてのメモリをリサイクルします。したがって、第 2 段階は仕上げ段階と呼ばれます。
GC の前後の図は、アクティブ インターバルとフリー インターバルの間に違いがないことを除いて、コピー アルゴリズムの図と非常に似ており、プロセスはマーク/クリア アルゴリズムと非常に似ています。以下に示すように、GC 前のメモリ内のオブジェクトのステータスとレイアウト。
この図は実際にはマーク/クリア アルゴリズムとまったく同じですが、メモリ ルールの連続的な配置を容易にするために、LZ がメモリ領域を表す四角形を追加した点が異なります。この時点で GC スレッドが動作を開始すると、マーキング フェーズが直ちに開始されます。このステージは、マーク/クリア アルゴリズムのマーキング ステージと同じです。以下に示すように、マーキング ステージ後のオブジェクトの状態を調べます。
次に説明することは何もありません。以下に示すように、ソートフェーズが完了した後のメモリレイアウトがどのようになるかを見てみましょう。
マークの付いた残りのオブジェクトがメモリ アドレスに従ってソートおよび配置され、マークの付いていないメモリがクリーンアップされることがわかります。このようにして、新しいオブジェクトにメモリを割り当てる必要がある場合、JVM はメモリの開始アドレスを保持するだけで済み、空きリストを維持するよりも明らかにオーバーヘッドが少なくなります。
マーキング/整理アルゴリズムが、マーキング/クリア アルゴリズムの分散したメモリ領域の欠点を補うだけでなく、コピー アルゴリズムのメモリを半分にするという高コストを排除できることを理解するのは難しくありません。一石二鳥、一石二鳥、一石二鳥と言われています。 。 。 。女性が1人、男性が2人ですか?
ただし、どのアルゴリズムにも欠点はあります。マーキング/編成アルゴリズムの唯一の欠点は、すべての生き残ったオブジェクトをマークする必要があるだけでなく、すべての生き残ったオブジェクトの参照アドレスを分類する必要があることです。効率の点では、マーキング/照合アルゴリズムはコピー アルゴリズムよりも劣ります。
アルゴリズムの概要
ここでは、LZ が 3 つのアルゴリズムの共通点とそれぞれの長所と短所を要約して、比較するとより明確になるようにします。
主な共通点は以下の2点です。
1. 3 つのアルゴリズムはすべて、オブジェクトをリサイクルする必要があるかどうかを決定するルート検索アルゴリズムに基づいています。ルート検索アルゴリズムの通常の動作をサポートする理論的基盤は、文法内の変数スコープの関連内容です。したがって、メモリ リークを防ぐ最も基本的な方法は、メモリ管理に関する前の章で説明した C/C++ スタイルのメモリ管理方法を使用するのではなく、変数スコープをマスターすることです。
2. GC スレッドが開始されるとき、または GC プロセスが開始されるときは、アプリケーションを一時停止する (世界を停止する) 必要があります。
LZ は以下の点に基づいてそれらの違いを示します。 (> は前者が後者より優れていることを意味し、= は 2 つの効果が同じであることを意味します)
効率: コピー アルゴリズム > マーク/照合アルゴリズム > マーク/クリア アルゴリズム (ここでの効率は時間計算量の単純な比較です。実際の状況は必ずしもそうではありません)。
メモリの整理整頓: コピー アルゴリズム = マーク/整理アルゴリズム > マーク/クリア アルゴリズム。
メモリ使用率: [b] マーク/照合アルゴリズム = マーク/クリア アルゴリズム > コピー アルゴリズム。 [/b]
マーク/クリア アルゴリズムは比較的後進的なアルゴリズムであることがわかりますが、後の 2 つのアルゴリズムは、「困ったときには井戸掘り人を忘れるな」ということわざに基づいて構築されています。ので、このアルゴリズムの前任者をマーク/クリアすることを忘れないでください。また、ある時点で、マーク/スイープが機能します。
結論
これで、3 つのアルゴリズムについて明確に理解できました。効率の点ではレプリケーション アルゴリズムが優れていますが、上記の 3 つを考慮するとメモリを大量に浪費します。 , 指標として、マーキング/整理アルゴリズムは比較的スムーズですが、効率はまだ満足のいくものではありません。コピー アルゴリズムよりもマーキング ステージが 1 つ多く、マーキング/クリア アルゴリズムよりもメモリを整理するプロセスが 1 つ多くあります。
最適なアルゴリズムはないのでしょうか?
もちろんそうではありません、世界は公平です、すべてには二面性があります、想像してみてください、美しく、勤勉で、裕福で、合理的で、適切な性格、適切な家族背景、身長、外見などを備えた人をどうやって見つけることができますか? . すべての適切な女性ですか?たとえ見つけたとしても、この女性には絶対に満足できないことが少なくとも 1 つある。それは、おそらく LZ に似た勤勉な猿の友人の誰とも恋に落ちることはないだろうということだ。あなたは LZ よりもはるかに優れていると言いたいですか? では、LZ は、Gao Fushuai がコンピューターの前に這って技術記事を読むつもりはないと言いたいだけです。0.0。
しかし、古代人は素晴らしいです、妻を探すときは、最高の人を見つける必要はありませんが、最も適した人を見つける必要があると言いました。この言葉を聞いた後、私はすぐに世界がはるかに良くなったと感じました。
アルゴリズムは同じです。最適なアルゴリズムはありません。最も適切なアルゴリズムがあるだけです。
これら 3 つのアルゴリズムには独自の欠陥があるため、専門家は当然これが起こることを許可しません。したがって、専門家は、ニンジンやキャベツにはそれぞれ独自の好みがあるのと同様に、オブジェクトのさまざまな特性に応じてさまざまなアルゴリズムを使用して処理できることを提案しました。そこで奇跡が起こり、専門家たちはついに GC アルゴリズムの中でも神レベルのアルゴリズム、つまり世代別コレクション アルゴリズムを発見しました。
この神レベルのアルゴリズムがどのように処理されるかについては、次の章で LZ が猿の友人たちと話し合います。今回はここまでです。
上記は、JVM メモリ管理の内容です ------- GC アルゴリズム (コピー アルゴリズムとマーキング/照合アルゴリズム) 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。