JAvaごみ回収メカニズムの原理とメリットとデメリット

4479 ワード

ごみ回収アルゴリズムの詳細を添付します
 
利点:a.メモリ管理を考慮する必要はなく、b.メモリの漏洩を効果的に防止し、使用可能なメモリを有効に利用することができる.c.ゴミ回収メカニズムがあるため、Javaのオブジェクトには「役割ドメイン」の概念がなく、オブジェクトの参照だけが「役割ドメイン」である
原理:ゴミ回収器は単独の低レベルのスレッドとして動作し、メモリスタックで死亡したオブジェクトまたは長期にわたって使用されていないオブジェクトを知らないうちに回収するが、あるオブジェクトまたはすべてのオブジェクトをリアルタイムで回収することはできない.
ごみ回収メカニズム:世代別複製ごみ回収、標識ごみ回収、増量ごみ回収
GC(Gabage Collection)の動作原理:オブジェクトを作成すると、GCはそのオブジェクトのアドレス、サイズ、使用状況を監視し始めます.通常、GCはheap(スタック)内の素有オブジェクトを図面に記録し、管理します.この方法で、どのオブジェクトが「到達可能」であり、「到達不可能」であるかを決定します.. ごみ回収メカニズムは通常、単独の低レベルのスレッドとして動作、メモリスタック内ですでに死亡している、または長い間使用していないオブジェクトを予知することなくクリーンアップすることができるが、Systemを呼び出すことができる.gc()はゴミ回収機を稼働させるが,GCが必ず実行されるとは保証できない.
           1.ごみ回収メカニズムの目標は、JVMスタックメモリのメモリ空間である不要なオブジェクトのメモリ空間を回収することである.ごみ回収はメモリ資源のみを回収し、データベース接続、Socket、I/Oストリームなどの物理資源に対してはどうしようもなく、私たちは自分で回収を閉じる.
    2.ごみ回収メカニズムが不要なオブジェクトが占めるメモリ領域を回収するのを速めるために、オブジェクトの参照変数をnullに設定することができます(nullに設定すると、ごみ回収メカニズムはすぐに実行されません).
    3.ごみ回収メカニズムの潜在的な欠点は、そのオーバーヘッドが性能に影響を与える.Java仮想マシンは、プログラムで使用可能なオブジェクトを追跡してこそ、どのオブジェクトが不要なのかを決定し、不要なオブジェクトが占めるメモリ領域を解放することができます.このプロセスにはプロセッサの時間がかかります.
    4.ごみ回収の予知不能性.Runtimeオブジェクトのgc()メソッドまたはSystem.gc()の方法はシステムにごみ回収を提案するが、ごみ回収メカニズムの実行を正確に制御することはできない.
AVAごみ回収メカニズム(GC)簡単紹介
JAvaのゴミ回収メカニズム(Garbage Collection,GC)により、プログラマーがプログラムを書くときにメモリの動的割り当てやゴミ回収の問題に関心を持つ必要がなくなり、JVMが処理します.これらの作業を処理する必要はありませんが、javaゴミ回収メカニズムの基本原理を理解する必要があります.結局、ゴミ回収メカニズムに基づいてプログラムの丈夫性を保証する必要がある場合があります(メモリ漏れ防止).
まず、2つの問題を理解しなければなりません.
Javaでは、どのオブジェクトが「ゴミ」と定義されますか?
ごみ回収を実行する過程で、仮想マシンはどのような回収アルゴリズムを採用してごみ回収を実行しますか?
1.どのオブジェクトが「ゴミ」と定義されますか?
Javaでは参照によってオブジェクトに関連付けられます.つまり、オブジェクトを操作するには参照によって行う必要があります.では、単純な方法でカウントを参照することで、オブジェクトが回収されたかどうかを判断することができ、オブジェクトに1つの参照が関連付けられていない場合、オブジェクトが他の場所で参照される可能性はほとんどなく、そのオブジェクトが回収されたオブジェクトになる可能性があります.この方法は簡単で効率が高い.しかし,この方法にも一定の欠点があり,ループ参照の方法は解決できない.ループリファレンスとは?コードを示す
public class App{
    public static void main(String[] args) {
        Test object1 = new Test();
        Test object2 = new Test();

        object1.object = object2;
        object2.object = object1;

        object1 = null;
        object2 = null;
    }
}

class Test{
    public Test object = null;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
最後の2つの文はobject 1とobject 2をnullに設定が、互いに参照するため、結果としてカウントが0ではなく、ゴミ収集器では回収できない.
そこでこの問題を解決するためにjavaでは達成性分析法を採用した.この方法の基本思想は,一連の「GC Roots」オブジェクトを起点として探索することであり,「GC Roots」と1つのオブジェクトとの間に到達経路がなければ,そのオブジェクトは到達できないと呼ぶが,到達できないと判定されたオブジェクトが必ずしも回収可能なオブジェクトになるとは限らないことに注意する.不可と判定されたオブジェクトが回収可能オブジェクトになるには少なくとも2回のマーキングプロセスを経なければならず、この2回のマーキングプロセスにおいても回収可能オブジェクトになる可能性から逃れられなければ、基本的には本当に回収可能オブジェクトになる.
この方法は参照カウント側よりも厳密であり,ループ参照の問題を解決する可能性がある.
2.java仮想マシンはどのようなアルゴリズムを採用してゴミ回収を実行しますか?
この質問に答える前に,現在のごみ回収にはどのような主流の回収アルゴリズムがあるかを理解する.1).Mark-Sweep(マーキング-クリア)アルゴリズム回収が必要なオブジェクトをマーキングし、GC操作が必要なときにマーキングされたオブジェクトを一括クリアしてゴミ回収を実現する最も基本的なアルゴリズムです.変更方法は簡単で効率的ですが、メモリの破片を招くという欠点があります.
2).Copying(コピー)アルゴリズムCopyアルゴリズムは、メモリ領域を同じサイズの2つのサブ領域に分割し、そのうちの1つのブロックにオブジェクト割り当てを実行し、そのブロックのメモリが切れたら、その領域がまだ生きているオブジェクトを別のメモリ領域にコピーし、使用したメモリ領域を一度にクリーンアップすることで、メモリフラグメントの問題を起こさない問題ですが、毎回半分のメモリしか使えず、メモリに対する圧力が大きいという明らかな欠点があります.
3).Mark-Compact(タグ-整理)アルゴリズムMark-CompactアルゴリズムはMark-Sweepアルゴリズムに基づいて改良されたもので、アルゴリズムタグはMark-Sweepと同様にタグが終わった後、タグのオブジェクトを一端に移動し、境界以外のメモリ領域をクリーンアップするだけでメモリフラグメント化の問題を解決する
3).Generational Collection(世代別収集)アルゴリズム現在Jvmで使用されているゴミ回収アルゴリズムです.オブジェクトのライフサイクルに応じてメモリをいくつかの異なる領域に分割することを核心としています.古い世代(Tenured Generation)と新しい世代に分けられます(Young Generation).旧世代のメモリ領域のオブジェクトは一般的に回収頻度が低く、Mark-Compactアルゴリズムを採用していたが、新生代のメモリ領域は毎回大量のオブジェクトを回収する必要があり、回収頻度が高いため、この領域を大きなEden空間と2つの小さなSuvivor空間に分け、Eden空間と1つのSurvivor空間を使用するたびに、ごみを回収する必要がある場合には、Eden空間とそのSurvivor空間の生存対象を別のSurvivor空間にコピーし、その後、Edenとさっき使用したSurvivor空間にクリーンアップし、ごみ回収機構を実現する.
だからjavaごみ回収メカニズムは主に達成性分析法と世代別収集アルゴリズムに注目し,それらの利点を理解することに注目している.