Рассмотрим эти два класса:
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
выходит из области видимости, и сборщик мусора должен иметь возможность его собрать., но если бы он собирал его, ему нужно было бы сначала собрать a
, который является членом B
, а чтобы собрать a
, ему нужно сначала собрать b
, который является членом A
,Это становится круглым.Поэтому мой вопрос: собирается ли такая круговая ссылка помешать GC собирать объекты?
- Если да, то как мы можем избежать этой проблемы?Как мы можем убедиться, что у нас нет круговой ссылки в дизайне нашего класса?Существует ли какой-либо инструмент (или опция компилятора), который помогает нам обнаруживать циклическую ссылку?
- Если нет, где и почему мы используем
WeakReference
класс?Какова его цель?