Подтвердить что ты не робот

Являются ли нестатические внутренние объекты объектов мусором собранными после того, как они больше не ссылаются?

У меня есть один spring bean, похожий на следующий:

public class MyServiceImpl {
    private MyDAO myDAO;

    public class MyInnerClass implements SomeInterface<MyInnerClass> {

        @Override
        public MyInnerClass loadFreshObject(final String key) {
            return myDAO.load(key);
        }
    }

}

Экземпляры MyInnerClass создаются в коде вне spring bean, но ссылки на эти экземпляры не сохраняются.

Предполагая, что у меня нет контроля над использованием этих открытых нестатических внутренних классов (я знаю, что в идеале они были бы частными и статическими, чтобы избежать утечки ссылки на 'this'), будут ли созданные экземпляры "MyInnerClass" правильными сбор мусора?

Я выполнил свои собственные тесты на этом, переопределив finalize(), и кажется, что экземпляры правильно собирают мусор, я просто надеялся на разъяснения по этому поводу.

Спасибо

4b9b3361

Ответ 1

Экземпляры внутреннего класса будут собирать мусор в соответствии с обычными правилами (т.е. когда они больше не ссылаются). Однако каждый экземпляр внутреннего класса содержит скрытую ссылку на свой родительский экземпляр внешнего класса. Это означает, что, если есть какие-либо живые ссылки на экземпляры внутреннего класса, они предотвратят сбор мусора из связанных экземпляров внешнего класса. Но он работает только в этом направлении, а не наоборот.

Ответ 2

Почему они не собирали мусор? GC не заботится о типе объекта. Если он недоступен, он GCed. Если он достигнут, он не GCed.

Ответ 3

Если ссылок на объект нет, он будет отмечен для коллекции. Таким образом, это должно быть хорошо, даже если это открытый, нестатический внутренний класс.

Другим способом, например, если бы были ссылки на эти внутренние объекты класса, тогда внешний объект класса не будет собран, даже прямых ссылок на него нет.

Ответ 4

Конечно, кстати, если ваши экземпляры сохраняются Spring как singleton beans, Spring (но не ваш код) будут ссылаться на них, и они не будут собираться с мусором.