次の2つのクラスを検討してください。
public class A
{
B b;
public A(B b) { this.b = b; }
}
public class B
{
A a;
public B() { this.a = new A(this); }
}
上記のように設計されたクラスがある場合、そのようなクラスのオブジェクトはガベージコレクター(GC)によって収集されますか?
私がこれを行うと仮定します:
void f()
{
B b = new B();
}
このメソッドでは、B
と呼ばれるb
のインスタンスを作成します。メソッドが戻ると、b
はスコープ外になり、GCがそれを収集できるはずです。しかし、それを収集する場合、a
のメンバーであるB
を最初に収集し、a
を収集するには、b
最初にA
のメンバーです。円形になります。だから私の質問は:そのような循環参照はGCがオブジェクトを収集するのを妨げますか?
WeakReference
クラスを使用するのですか?その目的は何ですか?.Netガベージコレクターは、循環参照を完全に処理できます。 veryガベージコレクタがどのように機能するかについての高レベルのビューは...
これにより、循環参照を問題なく収集できます。収集できないことがわかっているオブジェクトから到達できない限り、循環参照は本質的に無関係です。
注:この答えをシンプルかつ直接的に保つために、私は多くの楽しい詳細を省略していることに気づきました
いいえ、GCは循環参照を処理できるため、これは問題にはなりません
MSDNは言う
オブジェクトのグループに相互参照が含まれているが、これらのオブジェクトがスタックまたは共有変数から直接または間接的に参照されていない場合、ガベージコレクションは自動的にメモリを再利用します。
いくつかの回答は、循環参照は問題ではないことをすでに説明しています。
弱参照について-それらを使用する理由はキャッシュです。
GCがオブジェクトの依存関係ツリーを歩くとき、彼は弱い参照を無視します。言い換えると、オブジェクトへの唯一の参照が弱いものである場合、そのオブジェクトはガベージコレクションされますが、参照の作成と使用の試行の間にガベージコレクションがなかった場合でも、オブジェクトにアクセスできます。
いいえ、その循環参照はガベージコレクターに影響を与えず、Bのインスタンスを完全に収集できます。
ガベージコレクターは、スコープの外に出た後は誰もBのインスタンスを参照できないことを知っているため、Bのインスタンスを使用してAを間接的に参照することはできません。