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

Что касается объема и сбора мусора в контейнере Spring bean

Я новичок в spring, и в настоящее время я использую его в одном из моих проектов. Я узнал, что контейнер spring содержит все beans, а область всех beans по умолчанию является одиночной. Я могу изменить область действия в application-context.xml или использовать аннуляцию @scope.

Теперь мой вопрос в том, имеет ли область видимости класс "prototype", контейнер spring будет создавать новый объект каждый раз, когда это необходимо для одного... правильно? Теперь, как обрабатывается сбор мусора. Будут ли объекты собирать мусор, если они больше не используются или будут все еще болтаться в контейнере. Потому что я не хочу, чтобы многие объекты создавались каждый раз, когда они нужны, и загружали память.

кто-то поможет мне с пониманием этого, пожалуйста. Спасибо.

4b9b3361

Ответ 1

Из Spring документации (3.5.2 Область прототипа):

В отличие от других областей, Spring не управляет полным жизненным циклом прототипа bean: контейнер создает, настраивает и иным образом собирает прототип объекта и передает его клиент, не будет записывать этот экземпляр прототипа.

Проще говоря - после создания и получения ссылки на prototype scoped bean, это единственная ссылка, существующая в JVM. Как только эта ссылка выходит из области видимости, объект будет собирать мусор:

void bar() {
  Object foo = ctx.getBean("foo")
}

В момент, когда вы покидаете метод bar(), нет никаких других ссылок на новый экземпляр foo, что означает, что он имеет право на сбор мусора. Следствием этой модели является:

Таким образом, хотя методы обратного вызова жизненного цикла инициализации вызываются на всех объектах независимо от области видимости, в случае прототипов, вызываемые обратные вызовы жизненного цикла конфигурации не вызываются.

Ответ 2

Контейнер не поддерживает ссылку на экземпляр beans, код, который их использует.

Если ничего не ссылается на bean (грубо), оно имеет право на GC.