オブジェクトがガベージアルゴリズムであるかどうかを判断することは、主に次の二つがあります。
- 参照カウントアルゴリズム
- 到達可能性解析アルゴリズム
さんがそれぞれ見てみましょう。
参照カウントアルゴリズム
オブジェクトが参照カウンタがデクリメントされ、障害時に参照カウンタがインクリメントされて上昇した場合、オブジェクトの参照カウントを追加します。オブジェクト0の参照カウントを回収することができます。
利点:
- シンプル
- 高効率、プログラムの実行に影響が少ないです
ほとんどの場合、参照カウントアルゴリズムは、それが良いアルゴリズムですが、また、そのようなのFlashPlayer ActionScript3の使用など、よりよく知られているアプリケーションの例のいくつかは、Python言語は、メモリ管理を参照カウントアルゴリズムを使用しています。
しかし、参照カウントアルゴリズムの欠点は、オブジェクト参照との相互流通の問題を解決することは困難であり、また非常に明白であるため、アプリケーション内部の主流のJava仮想マシンがメモリを管理するために参照カウントアルゴリズムを使用していません。
例としては、循環を引用しました:
public class ReferenceCounterProblem{
public ReferenceCounterProblem instance = null;
public static void main(String[] args) {
ReferenceCounterProblem a = new ReferenceCounterProblem();
ReferenceCounterProblem b = new ReferenceCounterProblem();
a.instance = b;
b.instance = a;
a = null;
b = null;
}
}
この場合、オブジェクトの元の点A、Bがアクセスできなくなり、そして尖った物体B(ヌルおよびBセットとして)、しかし、その後、この場合の基準を基準カウントアルゴリズムを使用してカウンタは1であり、そして2つのオブジェクトがメモリリークが発生し、この時点で回収することができないように、変更されません。
到達可能性解析アルゴリズム
(等のJavaやC#、など)主流の商用プログラミング言語を達成するための主流に、ザは、オブジェクト生存するかどうかを決定するために、到達可能性分析アルゴリズムによって呼び出されます。
アルゴリズムの基本的な考え方は、オブジェクトがGCのルーツへの参照を持っていない場合、一連のダウンこれらのノードから検索を開始するために、出発点として、「GCルーツ」オブジェクトと呼ばれる、と呼ばれる検索パスは、参照のチェーンを横断しましたチェーンに接続しているとき、このオブジェクトがリサイクルできることが判明しました。代わりに、到達可能なオブジェクトは生きています。
下に
オブジェクト1〜4は、被験者の生存率が決定されており、対象物5〜7は、リサイクルに決定しました。
GCのルーツは、メインターゲット次の4つのカテゴリとして使用することができます。
- ローカル変数テーブルで参照VMスタックオブジェクト
- JNIでネイティブメソッドスタック(APIに即ちそれらのネイティブメソッド)参照オブジェクト
- 領域によって参照されるメソッド静的プロパティクラスオブジェクト
- メソッドのゾーンオブジェクトリテラルの参照