Объявление переменной ссылочного типа внутри цикла for

Пусть у нас есть студенческий класс. Сформируйте следующий фрагмент кода (Java), который мы знаем -

Student aStudent = new Student();
  1. Ссылочная переменная типа "Студент" создана
  2. Объект 'Student' создается с помощью 'new Student()'
  3. Объекту присваивается ссылочная переменная 'aStudent'

Насколько я знаю, каждый раз, когда мы пишем 'new Student()', создается новый объект, и вновь созданному объекту выделяется пространство памяти. Но иногда мы пишем что-то подобное в цикле for -

for ( int i=0; i<10000; i++) {
 Student student  = new Student();
 ...
 ...
 ...
}

В этой ситуации -

  1. JVM создает новый объект Student 10000 раз? Или происходит какая-то оптимизация за сценой для экономии памяти.
  2. Если произошла какая-либо оптимизация, то как это делается? И как я могу узнать количество фактически созданных объектов в цикле for.

Заранее спасибо.

2 ответа

Решение

1. JVM создает новый объект ученика 10000 раз? Или происходит какая-то оптимизация за сценой для экономии памяти.

Да. Будет создано 10000 объектов Student. И в конце все 10000 из них не могут быть доступны, потому что все объекты и ссылки выйдут из области видимости (да, будет создано 10000 ссылок. 1 для каждого объекта). Все объекты и ссылки (по имени ученик) выйдут за рамки и будут готовы для GC.

2. Если произошла какая-либо оптимизация, то как это делается? И как я могу узнать количество фактически созданных объектов в цикле for

Я не в курсе каких-либо оптимизаций, выполняемых компилятором в этом сценарии. Но я знаю, что если вы используете инструмент статического анализа кода, такой как codePro, он пометит этот код как предупреждение. т.е. вы не должны создавать объекты в цикле.

Извините, если этот ответ не точный, так как я относительно новичок в Java.

Насколько я понимаю, будет создано 10000 объектов, но все, кроме 1, будут иметь право на сборку мусора, поскольку ничто не указывает на другие объекты.

Сборщик мусора - это единственная оптимизация, которая происходит за кулисами, однако она не может быть вызвана напрямую, но вы можете предложить для объекта для сборки мусора, просто установив для него значение null, т.е. student = null;

Другие вопросы по тегам