Рассмотрим эти два класса:
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
? Какова его цель?