JVM-GCのリサイクルメカニズム

目次

1.ゴミの判定

1.参照カウント

2.アクセシビリティ分析

2. ゴミを片付ける

1.マーククリア

2. 複製アルゴリズム

3.マーキングと仕上げ

 4. 世代リサイクル


 

上記の Java ランタイム メモリ分割では、プログラム カウンター、仮想マシン スタック、およびローカル メソッド スタックについて、ライフ サイクルはスレッドに関連し、スレッドとともに生まれ、スレッドとともに破棄され、メソッドが終了するか、スレッドが終了します。ここで説明するガベージ コレクションは、ヒープ領域とメソッド領域の 2 つの領域に関連しています。

ほとんどすべてのインスタンス オブジェクトはヒープに格納されます. ガベージ コレクタがヒープ上でガベージ コレクションを実行する前に, どのオブジェクトがまだ生きていてどれが "死んでいる" かを判断する必要があります. ガベージ コレクションは, 不適切なメモリを自動的に解放するのに役立ちます.メモリが占​​有され解放されていない場合、残りのメモリ領域はますます少なくなり、その後のメモリ アプリケーション操作の失敗にさらにつながります. サーバーは常に実行されており、最も恐れられているメモリ リークの問題です。

GC はオブジェクト単位でガベージ コレクションを実行します.使用中のオブジェクトとその一部は使用され、未使用のオブジェクトの一部は回収されません.使用されていないオブジェクトは回収され、オブジェクトの半分は回収されません.

GCの作業工程

1.ゴミの判定

使用され、参照されていないオブジェクトはガベージです。

オブジェクトに参照があるかどうかを判断する方法は?

1.参照カウント

Java ではなく、python/PHP で

カウンター (整数) は各オブジェクトに割り当てられます. オブジェクトを指す参照が作成されるたびにカウンターは +1 になり、参照が破棄されるたびにカウンターは -1 になります.

{
    Test t = new Test();//Test对象引用计数1

    Test t2 = t;//t2指向t,引用计数2

    Test t3 = t;//t3指向t,引用计数3
}

中括弧が終わると、上記の 3 つの参照は範囲外になり無効になり、参照カウントが 0 になります。

この時点で Test オブジェクトはガベージです

この方法は単純で効率的ですが、メモリ空間の使用率が低く、オブジェクトごとにカウンタを割り当てる必要があり、オブジェクトが多すぎるとメモリを大量に消費します。

もう1つの欠点は、循環参照の問題があることです

class{
    Test t = null;
}
Test a = new Test();//1号对象引用计数为1
Test b = new Test();//2号对象引用计数为1

a.t = b;//1号对象引用计数为2

b.t = a;//2号对象引用计数为2

このとき、ab 参照がすべて破棄され、オブジェクト 1 と 2 の参照カウントが両方とも -1 で 0 ではない場合、ガベージ コレクションは実行できませんが、実際には、これら 2 つのオブジェクトはそれらにアクセスする方法がありません。 . 

2.アクセシビリティ分析

Java のアプローチでは、Java のオブジェクトはすべて参照によって参照およびアクセスされます。多くの場合、参照はオブジェクトを参照し、このオブジェクトのメンバーは他のオブジェクトを参照します。たとえば、

class TreeNode{
    int value;
    TreeNode left;
    TreeNode right;  
}

Java のすべてのオブジェクトは、上記と同様の関係を介してチェーン/ツリー構造を介して接続されます

アクセシビリティ分析: すべてのオブジェクトの組織化された構造をツリーとして扱い、ルート ノードから開始し、ツリーをトラバースし、アクセスできるすべてのツリーを「到達可能」としてマークし、アクセスできないツリーは到達不能としてマークします。JVM は到達不能をリサイクルしますオブジェクト

到達可能性分析には、参照カウントよりも遅いツリーのような走査操作が必要ですが、到達可能性分析は常に実行されるわけではなく、たまに分析して 1 回リサイクルするだけで済みます。

到達可能性分析の開始点は GCroots と呼ばれます, スタック上のローカル変数, 定数プール内のオブジェクト, 静的メンバーは変数です. コードにはこのような開始点がたくさんあります. 各開始点をトラバースすれば完了です. 1 つのスキャンプロセス

2. ゴミを片付ける

2番目のステップ、ゴミを片付ける方法は?

3つの基本的なアプローチがあります

1.マーククリア

最初にリサイクルが必要なオブジェクトにマークを付け、マーキングが完了したら、マークされたすべてのオブジェクトを均一にリサイクルします

短所: メモリの断片化の問題を引き起こします. 解放されたメモリは断片化され、断片化されます. 大きなメモリを適用すると、アプリケーションが失敗します.

2. 複製アルゴリズム

「コピー」アルゴリズムは、「マーククリーニング」の効率の問題を解決するためのものです. 使用可能なメモリを容量に応じて同じサイズの 2 つの部分に分割し、一度に 1 つだけを使用します. このメモリの部分が必要な場合この領域に残っているオブジェクトを別のオブジェクトにコピーし、使用済みメモリ領域を一度にクリーンアップします。この利点は、半分の領域全体が毎回再利用されることであり、メモリの割り当て時にメモリの断片化などの複雑な状況を考慮する必要がなく、ヒープのトップ ポインターを移動して順番に割り当てるだけで済みます。このアルゴリズムは実装が簡単で、効率的に実行できます
欠点:
1.スペース利用率が比較的低い
2. また、リサイクルできるものが少ない場合は、コピーのコストも高くなります

3.マーキングと仕上げ

マーキング プロセスは、「マーク アンド スイープ」プロセスと一貫性があります。
ただし、次のステップは、再利用可能なオブジェクトを直接クリーンアップするのではなく、生き残ったすべてのオブジェクトを一方の端に移動してから、端の境界外のメモリを直接クリーンアップすることです
保証されたスペース使用率 メモリ断片化の問題も解決
不利な点は、移動する要素が多い場合、オーバーヘッドも非常に高くなることです。
それぞれのアプローチには長所と短所があります

 4. 世代リサイクル

これらの基本戦略に基づき、複合戦略「世代循環型」を策定
ガベージ コレクションをさまざまなシナリオに分割し、シナリオごとに異なるアルゴリズムを使用する
Java オブジェクトのライフサイクルは非常に短いか非常に長い. ライフサイクルの長さに応じて, オブジェクトに年齢に似た概念を導入するために異なるアルゴリズムが使用されます. つまり, GC ラウンドの後, より多くのラウンド,オブジェクトが存在する期間が長いほど
27a8a30fd0224498b4b71f358eb9752a.png
新しく作成されたオブジェクトは、若い世代の edenspace に配置され、GC のラウンドの後、survivor 領域に配置されます。
経験則として、ほとんどの Java オブジェクトの寿命は短いです。
edenspace=>サバイバル エリア: コピー アルゴリズムを使用
サバイビングエリアの後、GCテストも行われます.リサイクル可能なオブジェクトの場合はリサイクルされます.そうでない場合は別のサバイビングエリアに配置されます.s0s1は一度に1つだけ使用し、コピーバックします.オブジェクトが 2 つの生き残った領域にある場合 その領域は何度もコピーされ、古い時代に突入しようとしています。
古い世代もGCを行い、頻度は低くなりますが、古い世代のリサイクル対象物はマーキングにより選別されます。
 

 

 

 

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/130108873