この記事では、Java ガベージ コレクション メカニズムの学習の概要を共有します
メモリ リーク: メモリ リークとは、メモリ領域が使用後にリサイクルされないことを意味します。一般に、Java でのメモリ リークは、メモリ オブジェクトのライフ サイクルがプログラム内で存在する期間を超えることが原因です
ガベージ コレクションの意味: プログラミング時に考慮する必要があるメモリ管理の問題を解決し、メモリ リークを効果的に解決します問題を解決し、空きメモリ領域を最大限に活用してください。 Java オブジェクトにはスコープの概念がなくなり、オブジェクトへの参照のみがスコープを持ちます。
基本操作: (1) 不要なオブジェクトを発見します。(2) 不要なオブジェクトによって占有されているスペースをリサイクルし、プログラムで再度使用できるスペースに解放します。
リサイクル時間: ガベージ コレクションが発生する具体的な時間は予測できません。一般的に、次の 2 つの機会があります。
プログラマは JVM の GC インターフェイスを呼び出しますが、具体的な時間はシステムによって決定され、プログラムの実行中に大きなメモリ ブロックが必要になるだけです。現時点では十分な大きさのブロックを提供できないため、システムはガベージ コレクションのために GC を呼び出します。
リサイクルアルゴリズム:
参照カウント方法内容: 各オブジェクトが作成されると、オブジェクトインスタンスは変数 (参照カウンタと呼ばれます) に割り当てられ、変数 count の初期値は1 に設定すると、オブジェクトが参照されると、カウンター値が 1 ずつ増加します。オブジェクト インスタンスの参照がライフサイクルを超えるか、別の値に設定されると、参照カウンターは 1 ずつ減少します。参照カウンタ値が 0 になると、ガベージ コレクションを実行できます。 (注: このオブジェクト インスタンスは他のオブジェクトも参照する可能性があるため、オブジェクトがリサイクルされると、参照するすべてのオブジェクトのカウンターが 1 ずつ減ります。)
評価: より高速に実行でき、実際にはより便利です。 -time システムですが、循環参照の問題は解決できません。たとえば、オブジェクト a とオブジェクト b は相互参照しますが、a と b の値には null が代入されます。このとき、a と b が参照するオブジェクトにはアクセスできなくなりますが、それらは参照します。この時点で、GC はそれらを再利用しません。
ルート検索アルゴリズム内容: プログラム内のすべての参照関係をグラフとして扱い、ルートノードの GC Root オブジェクトから開始して、参照に対応するノードを見つけるなど、すべての参照ノードがグラフを形成します。残りのノードは参照されていないノード、つまり役に立たないノードとみなされます。
Java で GC ルート オブジェクトとして使用されるオブジェクトは、Java 仮想マシン スタックで参照されるオブジェクト、メソッド領域の静的プロパティによって参照されるオブジェクト、メソッド領域の定数によって参照されるオブジェクト、およびローカル メソッド スタックで参照されるオブジェクトです
マーク - クリーニングアルゴリズム内容: ルートコレクションからスキャンし、残っているオブジェクトにマークを付け、マークされていないすべてのオブジェクトをスキャンして、それらをリサイクルします。
評価: オブジェクトを移動する必要はなく、生存していないオブジェクトのみが処理されます。生存しているオブジェクトが多数ある場合はより効率的ですが、メモリの断片化が発生します。
マーク - アルゴリズムの整理内容: アルゴリズム 3 に基づいて、不要なオブジェクトをリサイクルした後、残っているすべてのオブジェクトが空きメモリを整理するために空き領域に移動されます。
評価: オーバーヘッドコストは増加しますが、断片化の問題は解決されます。
注: アルゴリズム 3、4、および 5 はすべてルート検索アルゴリズムに属しており、理解を容易にするためにここでは個別に説明されています。
コピーアルゴリズム内容: メモリをオブジェクト領域と空き領域に分割し、オブジェクト領域をスキャンし、オブジェクト領域内のすべての有効なノードを順番に空き領域にコピーし、元のオブジェクト領域を解放します。 、その後、元のオブジェクト領域が空き領域になります。オブジェクト領域とフリー領域の切り替え中にガベージコレクションが完了します。
評価: ハンドルのリサイクルが減少し、断片化は発生しませんが、切り替えプロセス中にプログラムを一時停止する必要があります。
生成アルゴリズムは、Javaクラス、メソッドなどの静的ファイルを保存するために使用されます。永続世代は、ガベージ コレクションに大きな影響を与えません。若い世代で N 回ガベージ コレクションが行われた後も存続するオブジェクトは、古い世代に配置されます。したがって、古い世代にはライフサイクルの長いオブジェクトが格納されていると考えられます。
メモリは新世代のメモリよりもはるかに大きいです (おそらく比率は 1:2) 旧世代のメモリがいっぱいになると、メジャー GC がトリガーされます。つまり、フル GC の頻度は比較的低くなります。 、古い世代のオブジェクトの生存時間は比較的長く、生存率のマークは高くなります。
新しく生成されたすべてのオブジェクトは、最初に若い世代に配置されます。若い世代の目標は、ライフサイクルの短い物体をできるだけ早く収集することです。
新世代のメモリは、8:1:1の比率で1つのeden領域と2つのsurvivor(survivor0、survivor1)領域に分割されます。 (一般的に) 1 つのエデン エリアと 2 つのサバイバー エリア。ほとんどのオブジェクトはエデンエリアで生成されます。リサイクルする場合は、eden 領域に残っているオブジェクトを survivor0 領域にコピーし、eden 領域をクリアします。この survivor0 領域もいっぱいになったら、eden 領域と survivor0 領域に残っているオブジェクトを別の survivor1 領域にコピーしてから実行します。 survivor0 領域では、この時点では survivor0 領域が空であり、その後、survivor0 領域と survivor1 領域が交換され、survivor1 領域は空のままになります。
survivor1領域にedenとsurvivor0の存続オブジェクトを格納できない場合、存続オブジェクトは直接旧世代に格納されます。古い世代もフルである場合、フル GC がトリガーされます。つまり、新しい世代と古い世代の両方がリサイクルされます。新しい世代で発生する GC は、マイナー GC とも呼ばれます。トリガーされる前に Eden 領域がいっぱいになるまで必ずしも待機する必要はありません)。 、永続的な生成)。
新世代:
古い世代:
永続世代:
以上がJava ガベージ コレクション メカニズムの学習概要を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。