Скажем, у меня есть следующие классы, как описано ниже:Циклические ссылки в Java и сборке мусора
class A {
private B b;
public A {
b = new B(this);
}
}
class B {
private C c;
private A a;
public B(A a) {
this.a = a;
c = new C(this);
}
public removeRefereceToC() {
c = null;
}
}
class C {
private B b;
public C(B b) {
this.b = b;
}
}
Если мы посмотрим на график ссылок, А ссылки В (и ссылки B A), ссылки B C (и ссылки C B). Теперь, если бы мы должны были вызвать метод B removeReferenceToC(), то ссылка B на объект C была бы устранена, но C все равно будет ссылаться на B. В этот момент C будет иметь право на сбор мусора?
Причина, по которой я не уверен, что из-за направления ссылок C больше не может быть достигнуто от B, что заставляет меня думать, что C имеет право на сбор мусора, однако тот факт, что C все еще ссылается на B, бросает меня выключили.
Итак, если B отменяет свою ссылку на C, будет ли C иметь право на сбор мусора?
Редактировать: Этот вопрос помечен как дубликат. Я думаю, что основное различие между моим вопросом и ранее задаваемыми вопросами можно суммировать следующим образом: Предыдущие вопросы: A -> B < => C, после чего удаляется ссылка от A до B, оставляя AB < => C
Мой вопрос: < => B < => C, то реф от B до C получает удаляют, оставляя < => B < - C
* «однако тот факт, что C все еще ссылается на B, отбрасывает меня». * Почему?Важно то, что есть ссылки на объект, а не на тот объект, к которому относится этот объект. – Tom
Важно то, может ли объект быть достигнут из корня GC: https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/ – Blorgbeard
@Tom Как я об этом думаю заключается в том, что есть стрелка, указывающая от B до C и другая стрелка, указывающая от C до B с каждой стрелкой, указывающей ссылку. Если я отклоняю ссылку B на C, я удаляю стрелку из B в C, но стрелка от C до B все еще остается (но она указывает от C до B). Итак, когда сборщик мусора делает свою вещь, он думает, что C до сих пор доступен из B? Или он видит «стрелку», указывающую от C до B, и понимает, что C недоступен из B? – neonDion