Предположим, что Outer
экземпляр где-то, и через некоторое время нет ссылок на него. Является ли неявная ссылка во inner
Outer
экземпляре препятствовать запуску GC, или же это "специальная" ссылка?
public class Outer {
private class Inner extends Something {}
private Inner inner = new Inner();
}
Если экземпляр Outer
недоступен из корня GC, ссылка на экземпляр Inner
в вашем примере кода не остановит сборщик мусора, освободив память, используемую Outer
.
Рассмотрим эту диаграмму:
Stack of main thread public static void main(String[] args) {
| Outer outer = new Outer();
v
Outer<--\
|\ |
v \---/
Inner
Stack of main thread outer = new Outer();
|
v
Outer<--\
|\ new|
v \---/
Inner
Outer<--\ // a reference to the Outer from the Inner
|\ old| // doesn't change the fact that the Outer
v \---/ // can't be reached from a GC root.
Inner // Thus the old Outer is eligible for collection (dead)
Outer
кроме как для одного из "изнутри", он имеет право на GC?
Outer
]"