ホームページ >Java >&#&チュートリアル >JVM ガベージ コレクション メカニズムの 5 つの形式: 詳細な解釈と比較

JVM ガベージ コレクション メカニズムの 5 つの形式: 詳細な解釈と比較

王林
王林オリジナル
2024-02-23 09:00:05944ブラウズ

JVM ガベージ コレクション メカニズムの 5 つの形式: 詳細な解釈と比較

JVM ガベージ コレクション メカニズムの 5 つの形式: 詳細な解釈と比較

要約: JVM ガベージ コレクション (ガベージ コレクション、GC と呼ばれる) は、コア機能の 1 つです。 Java 言語 One の理由は、プログラムの実行中に使用されなくなったメモリを効果的に解放できるからです。この記事では、JVM ガベージ コレクション メカニズムの 5 つの形式を詳細に説明し、それらの長所と短所を比較します。同時に、読者がこれらのガベージ コレクション メカニズムをよりよく理解できるように、具体的なコード例も提供します。

1. はじめに
JVM は Java Virtual Machine の略称で、Java プログラムの実行環境です。 Java プログラムでは、オブジェクトがメモリ内に作成されると、そのオブジェクトが占有しているメモリ空間を再利用するために、対応するメカニズムが必要になります。これはガベージコレクションのタスクです。

2. マーク スイープ アルゴリズム (マーク スイープ)
マーク スイープ アルゴリズムは、最も初期の最も基本的なガベージ コレクション アルゴリズムの 1 つです。その原理は単純です。まず、ルート ノードから開始して、到達可能なすべてのオブジェクトがマークされ、その後、マークされていないオブジェクトがクリアされます。

サンプル コード:

public class MarkSweep {
    private boolean marked;
    
    public void setMarked(boolean marked) {
        this.marked = marked;
    }
    
    public boolean isMarked() {
        return marked;
    }
}

public class GC {
    public static void main(String[] args) {
        MarkSweep object1 = new MarkSweep();
        MarkSweep object2 = new MarkSweep();
        
        object1.setMarked(true);
        
        System.gc(); // 垃圾回收
        
        if (object1.isMarked()) {
            System.out.println("object1 is reachable");
        } else {
            System.out.println("object1 is garbage");
        }
        
        if (object2.isMarked()) {
            System.out.println("object2 is reachable");
        } else {
            System.out.println("object2 is garbage");
        }
    }
}

3. コピー アルゴリズム (コピー)
コピー アルゴリズムは、ガベージ コレクションの問題を解決するために別の戦略を使用します。利用可能なメモリを 2 つのブロックに分割し、一度に 1 つのブロックのみを使用します。メモリの一部が使い果たされると、残っているオブジェクトを別のメモリにコピーし、現在のメモリ内のすべてのオブジェクトをクリアします。

サンプル コード:

public class Copying {
    private boolean marked;
    
    public void setMarked(boolean marked) {
        this.marked = marked;
    }
    
    public boolean isMarked() {
        return marked;
    }
}

public class GC {
    public static void main(String[] args) {
        Copying object1 = new Copying();
        Copying object2 = new Copying();
        
        object1.setMarked(true);
        
        System.gc(); // 垃圾回收
        
        if (object1.isMarked()) {
            System.out.println("object1 is reachable");
        } else {
            System.out.println("object1 is garbage");
        }
        
        if (object2.isMarked()) {
            System.out.println("object2 is reachable");
        } else {
            System.out.println("object2 is garbage");
        }
    }
}

4. マーク圧縮アルゴリズム (Mark-Compact)
マーク圧縮アルゴリズムは、マークスイープ アルゴリズムとコピーを組み合わせたガベージ コレクション アルゴリズムです。アルゴリズムです。最初に生きているオブジェクトにマークを付け、次にそれらを一方の端に移動し、次に他のオブジェクトを消去します。

サンプル コード:

public class MarkCompact {
    private boolean marked;
    
    public void setMarked(boolean marked) {
        this.marked = marked;
    }
    
    public boolean isMarked() {
        return marked;
    }
}

public class GC {
    public static void main(String[] args) {
        MarkCompact object1 = new MarkCompact();
        MarkCompact object2 = new MarkCompact();
        
        object1.setMarked(true);
        
        System.gc(); // 垃圾回收
        
        if (object1.isMarked()) {
            System.out.println("object1 is reachable");
        } else {
            System.out.println("object1 is garbage");
        }
        
        if (object2.isMarked()) {
            System.out.println("object2 is reachable");
        } else {
            System.out.println("object2 is garbage");
        }
    }
}

5. 世代別リサイクル アルゴリズム (世代別)
世代別リサイクル アルゴリズムでは、よりターゲットを絞った戦略を使用して、オブジェクトのライフ サイクルに従ってメモリを割り当てます。異なる世代。通常、新しく作成されたオブジェクトは新しい世代に割り当てられ、複数の GC を経ても生き残ったオブジェクトは古い世代に移動されます。

サンプルコード:

public class Generational {
    private boolean marked;
    
    public void setMarked(boolean marked) {
        this.marked = marked;
    }
    
    public boolean isMarked() {
        return marked;
    }
}

public class GC {
    public static void main(String[] args) {
        Generational object1 = new Generational();
        Generational object2 = new Generational();
        
        object1.setMarked(true);
        
        System.gc(); // 垃圾回收
        
        if (object1.isMarked()) {
            System.out.println("object1 is reachable");
        } else {
            System.out.println("object1 is garbage");
        }
        
        if (object2.isMarked()) {
            System.out.println("object2 is reachable");
        } else {
            System.out.println("object2 is garbage");
        }
    }
}

6. 評価と比較

  1. マーククリアアルゴリズムは最も基本的なアルゴリズムですが、効率が低く、メモリの断片化が発生します。
  2. コピー アルゴリズムはシンプルで効率的ですが、メモリ領域の半分しか利用できません。
  3. マーク - 圧縮アルゴリズムは、最初の 2 つのアルゴリズムの利点を組み合わせていますが、移動オブジェクトが必要であり、効率が若干劣ります。
  4. 世代別リサイクル アルゴリズムは、オブジェクトのライフ サイクルに従って世代を分割するため、よりターゲットを絞ったリサイクルを実現できますが、システムの複雑さが増加します。
  5. さまざまなガベージ コレクション アルゴリズムがさまざまなアプリケーション シナリオに適しており、適切なアルゴリズムを選択することが非常に重要です。

結論:
JVM ガベージ コレクション メカニズムには 5 つの形式があり、それぞれに独自の長所と短所があります。適切なリサイクル アルゴリズムを選択するには、特定のアプリケーション シナリオと要件に基づいたトレードオフが必要です。この記事では、読者がこれらのガベージ コレクション メカニズムをよりよく理解し、適用できるようにするために、詳細な説明とコード例を提供します。

以上がJVM ガベージ コレクション メカニズムの 5 つの形式: 詳細な解釈と比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。