目次
上記の 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. 複製アルゴリズム
3.マーキングと仕上げ
4. 世代リサイクル