なぜ GC の戦略と原則を理解する必要があるのですか?
その理由は、実際には前の章で触れています。それは、日々の仕事や研究において、メモリオーバーフローやメモリリークの問題が避けられないからです。 GC の戦略と原則を理解せずに上記の問題に遭遇すると、多くの場合、途方に暮れることになります。
関連する知識を理解した後でも、問題をすぐに解決できない場合もありますが、少なくとも迷うことはないということは確かです。
GC 戦略はどのような問題を解決しますか?
自動 GC を実行するので、それに対応する戦略が必要です。これらの戦略は、大まかに言うと次のような問題を解決します。
1. リサイクルできる物体。
2. これらのオブジェクトをいつリサイクルするか。
3. どのようなリサイクル方法が使用されているか。
[b]GC 戦略で使用されるアルゴリズムは何ですか[/b]
上記の 3 つの質問に関して、実際、最も重要な質問は最初の質問であり、どのオブジェクトをリサイクルできるかということです。
より効率的で、参照カウント アルゴリズムと呼ばれる、比較的シンプルで直感的な方法があります。ただし、このアルゴリズムには致命的な欠陥があります。つまり、循環参照のあるオブジェクトをリサイクルできないということです。 JVM がこの GC 戦略を採用している場合、プログラマがプログラムを作成するときに、次のようなコードが再び現れることは期待できないと想像してください。
public class Object { Object field = null; public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { Object objectA = new Object(); Object objectB = new Object();//1 objectA.field = objectB; objectB.field = objectA;// //to do something objectA = null; objectB = null;//3 } }); thread.start(); while (true); } }
このコードは少し意図的であるように見えますが、実際には、1 対 1 の関係を持つ 2 つのデータベース オブジェクトがお互いへの参照を維持するなど、実際のプログラミング プロセスで頻繁に発生します。最後の無限ループは、JVM が終了しないようにするためだけのもので、実際的な意味はありません。
現在使用しているGCでは、スレッドスレッドが終了するとobjectAとobjectBの両方がリサイクル対象のオブジェクトとして使用されます。また、GC が上記の参照カウント アルゴリズムを採用している場合、これら 2 つのオブジェクトは決してリサイクルされず、使用後にオブジェクトを明示的に null として分類したとしても、効果はありません。
ここで LZ が大まかに説明します。コードでは、LZ は 3 つの数字 1、2、3 をマークします。最初のステートメントが実行されると、2 つのオブジェクトの参照カウントはすべて 1 になります。 2 番目のステートメントが実行されると、両方のオブジェクトの参照カウントが 2 になります。 3 番目のステートメントが実行された後、つまり両方が NULL 値として分類された後、2 つの参照カウントは 1 のままです。参照カウント アルゴリズムのリサイクル ルールに従って、参照カウントは 0 になるまでリサイクルされません。
ルート検索アルゴリズム
参照カウント アルゴリズムの欠陥のため、JVM は通常、ルート検索アルゴリズムと呼ばれる新しいアルゴリズムを使用します。その処理方法は、複数のルート オブジェクトをセットアップすることです。ルート オブジェクトが特定のオブジェクトに到達できない場合、そのオブジェクトはリサイクル可能であると見なされます。
上の図を例にとると、ObjectD と ObjectE は相互に関連していますが、GC ルートがこれら 2 つのオブジェクトに到達できないため、D と E は最終的に GC オブジェクトとみなされます。上の図では参照カウント方式を使用しているため、A ~ E の 5 つのオブジェクトはリサイクルされません。
GC ルートと言えば、JAVA 言語では次のオブジェクトを GC ルートとして使用できます。
1. 仮想マシン スタックで参照されるオブジェクト。
2. メソッド領域のクラスの静的プロパティによって参照されるオブジェクト。
3. メソッド領域の定数によって参照されるオブジェクト。
4. ローカル メソッド スタック内の JNI によって参照されるオブジェクト。
最初のタイプと 4 番目のタイプはどちらもメソッドのローカル変数テーブルを参照します。2 番目のタイプは主に、final として宣言された定数値を参照します。
ガベージ コレクション アルゴリズム
ルート検索アルゴリズムは、ガベージ コレクションの基本的な問題を解決します。これは、前述の最初の問題であり、どのオブジェクトをリサイクルできるかという最も重要な問題です。
ただし、ガベージ コレクションでは、リサイクルする時期とリサイクル方法という最後の 2 つの問題を解決する必要があることは明らかです。最新の仮想マシンの実装には、ルート検索アルゴリズムに基づいて、マーク クリア アルゴリズム、コピー アルゴリズム、およびマーク ソート アルゴリズムという 3 つの主要なガベージ コレクション アルゴリズムがあります。これら 3 つのアルゴリズムはすべてルート検索アルゴリズムを拡張したものですが、それでも非常に理解しやすいものです。
結論
上記は JVM メモリ管理の内容です-----GC の紹介 さらに関連した内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。