Java で正確な GC コレクション時間をピン留めしようとするのは恐ろしいことだと思いますが、とにかく ..
.. Java ガベージ コレクションは、オブジェクトの到達可能性で機能します。オブジェクトが強力に到達可能な場合、つまり、ローカル変数を含む到達可能性または既知のルートから任意のパスでアクセスできる場合、オブジェクトは再利用できません1。
ここで、W、X、Y、Z は A の異なるインスタンスを表します。特定の A を示すために使用する構文は、メンバー変数を参照するinstance {a-> instance}
場所です。a
それぞれが異なるインスタンスnew
を作成し、オブジェクト値の割り当てによって新しいオブジェクトが作成されないことに注意してください (そのため、現在 a1 と a3 によって共有されている同じ Y オブジェクトが割り当て中に変更されます)。a1.a=new A(null)
A a1=null; // a1 = null
A a2=new A(new A(null)); // a2 = W {a-> X}
A a3=new A(a2); // a3 = Y {a-> W}
a1=a3; // a1 = a3 = Y {a-> W}
a1.a=new A(null); // a1 = a3 = Y {a-> Z}
a2.a=null; // a2 = W {a-> null}
System.gc();
// Then:
// a1 = a3 = Y {a-> Z} (Expanding: Y {a-> Z {a-> null}})
// a2 = W {a-> null}
したがって、変数 a1 と a3 (到達可能性のルート) は最後に"参照"Y {a->Z}
され、a2 は "参照" されW {a->null}
ます。これは、W、Y、および Z はすべてまだ強力に到達可能 (Z は Y を介して強力に到達可能) であり、Java ランド2での再利用の対象とは見なされないことを意味します。
X のみがラインで到達できなくなりましたSystem.gc()
。ただし、これは、明示的な GC 呼び出しであっても、X がガベージ コレクションされることを意味するものではありません。これは、X が将来のある時点で再利用される資格があることを意味するだけです。
もちろん、関数が終了するとすぐに、すべてのローカル変数は到達可能性のルートではなくなり、どの A オブジェクトも強く到達可能ではなくなり、すべてが適格になります:)
1オブジェクトの到達可能性を使用して GC を議論することは、従来のマーク & スイープ ベースのアプローチ (JVM で一般的に見られる) を使用しない場合でも機能します。これは、正常に機能する GC システムに同じルールが適用されるためです。アクセスすると、再利用できません。逆に、オブジェクトにアクセスできない場合は、再利用する必要があります。
2到達可能性ルートを決定するルールは、言語/ランタイムによって異なります。たとえば、特定のエッジ ケースでの C#/CLR 処理には微妙な違いがあります。