Javaオブジェクトが生存しているかどうかの参照カウントアルゴリズム&達成性分析アルゴリズム
1443 ワード
JAvaは,仮想マシンのGCメカニズムによりオブジェクトを使用しない回収を完了し,仮想マシンがオブジェクトが生存しているか否かを判断する方法は,参照カウントアルゴリズムと達成性解析アルゴリズムの2つである.参照カウントアルゴリズムは、オブジェクトに参照カウンタを追加し、位置が参照されるたびにカウンタの値に1を加算し、参照が失効すると参照のカウント値は1を減算します.参照カウンタの値が0の場合、オブジェクトは使用できません.
以上のコードでは、bオブジェクトとcオブジェクトを作成した後、その参照カウンタの値はそれぞれ1であり、cオブジェクトとbオブジェクトが互いに相手を参照した後、その参照カウンタの値はそれぞれ2に増加すると、bオブジェクトとcがnullに割り当てられた後、参照カウンタの値はそれぞれ1に減少し、1になり、もう使用されなくなったが、ゴミ回収されない.可達性分析可達性分析の構想は、現在のオブジェクトからGC Rootsまでの参照経路が存在しない、すなわち参照チェーンを判断することによって、なぜこのようにしてオブジェクトが生存しているかを判断できるのか.まず,GC Rootsとして利用できるオブジェクトを分析する.まず、GC Rootsとして使用できるオブジェクトのクラスはスタックです(仮想マシンスタックとローカルメソッドスタックを含む)内のオブジェクト.スタックフレームがメソッドの実行と終了に伴って自動的にスタックとアウトスタックに入るため、スタック内のオブジェクトは必然的に有用であり、その参照するオブジェクトも必然的に有用であり、その参照するオブジェクトが再参照するオブジェクトもある......では、オブジェクトがGC Rootsに存在するかどうかを判断することによって到達可能な経路では、対象が有用であるか否かを判断する基準とすることができる.さらに、GC Rootsオブジェクトとして、静的変数や定数参照のオブジェクトも使用できます.
class B {
C c;
}
class C {
B b;
}
public class A {
public static void main(String[] args) {
C c=new C();
B b=new B();
c.b=b;
b.c=c;
b=null;
c=null;
}
}
以上のコードでは、bオブジェクトとcオブジェクトを作成した後、その参照カウンタの値はそれぞれ1であり、cオブジェクトとbオブジェクトが互いに相手を参照した後、その参照カウンタの値はそれぞれ2に増加すると、bオブジェクトとcがnullに割り当てられた後、参照カウンタの値はそれぞれ1に減少し、1になり、もう使用されなくなったが、ゴミ回収されない.