ヒープメモリに格納されているJavaオブジェクトインスタンスの場合、最初にこれらのオブジェクトのどれがまだ「ライブ」で、どれが「デッド」であるかを判断する必要があります。現時点では、オブジェクトが生きているかどうかを判断するための2つのアルゴリズムがあります。参照カウントと利用可能な到達可能性分析方法。、1つずつまとめましょう。
1.参照カウント
アイデア:各オブジェクトに参照カウンターを追加します。カウンターが参照するたびに、カウンター値が1増加します。参照が失敗すると、カウンターの値が1減少します。カウンターが0のオブジェクトは、いつでもできません。つまり、ガベージコレクターはリサイクルできます。
利点:参照カウント方法は実装が簡単ですが、効率的ではありません。ほとんどの場合、MicrosoftのCOM(コンポーネントオブジェクトモデル)テクノロジなどの優れたアルゴリズムです。言語やゲームスクリプトの分野で広く使用されているActionScript3のFlashPlayerであるPythonSquirrelを使用すると、メモリ管理に参照カウントアルゴリズムが使用されます。
短所:オブジェクト間の相互循環参照の問題を解決するのは困難です。
たとえば、次のコード:
public class Test {
public Object instance = null;
private static final int _1MB = 1024*1024;
/**
* 此成员作用,占用内存,以便能在gc日志中看清是否被回收过
*/
private byte[] bigSize = new byte[2*_1MB];
public static void testGC() {
Test obj1 = new Test();
Test obj2 = new Test();
obj1.instance = obj2;
obj2.instance = obj1;
obj1 = null;
obj2 = null;
System.gc();
}
}
実際、これら2つのオブジェクトにはアクセスできなくなりましたが、相互に参照しているため、参照カウンター値は0ではないため、このアルゴリズムをリサイクルすることはできません。
2.到達可能性分析アルゴリズム
Java、C#、およびその他の言語では、到達可能性分析アルゴリズムを使用して、オブジェクトが生きているかどうかを判断します。
アイデア:「GCルート」と呼ばれる一連のオブジェクトを開始点として使用し、これらのノードから開始して、下方向に検索します。検索渡されたパスは参照チェーンと呼ばれます。GCルートへのオブジェクトの参照チェーンがない場合、オブジェクトが停止した(使用不可)ことを証明します。次のようになります。
黄色はまだ生きているオブジェクト、白はまだ生きているオブジェクトです。
Java言語でリサイクル可能と判断されたオブジェクト。GCルートとして使用できるオブジェクトは次のとおりです。
- (1)仮想マシンスタック(スタックフレーム内のローカル変数テーブル)で参照されるオブジェクト。
- (2)メソッド領域のクラス静的プロパティによって参照されるオブジェクト
- (3)定数はメソッド領域の0個のオブジェクトを参照します
- (4)ローカルメソッドスタック内のJNI(つまりネイティブメソッド)
によって参照されるオブジェクト参照の分類:強参照、ソフト参照、弱参照、ファントム参照