Java делает вложенный экземпляр класса предотвращающим сборку мусора из внешнего класса

1

Предположим, что Outer экземпляр где-то, и через некоторое время нет ссылок на него. Является ли неявная ссылка во inner Outer экземпляре препятствовать запуску GC, или же это "специальная" ссылка?

public class Outer {
    private class Inner extends Something {}

    private Inner inner = new Inner();
}
Теги:
oop
garbage-collection

1 ответ

3
Лучший ответ

Если экземпляр 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)
  • 0
    Просто чтобы уточнить, поскольку нет никаких ссылок на Outer кроме как для одного из "изнутри", он имеет право на GC?
  • 1
    Не совсем, он имеет право на GC в соответствии с утверждением, которое вы сделали в своем вопросе "и через некоторое время нет ссылок на него [ Outer ]"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню