Я знаю аналогичный вопрос задавался много раз ранее, но я все еще не убежден в том, что объекты становятся подходящими для GC и какой подход более эффективен.Если переменные объявлены внутри цикла или вне цикла в java
подход один:
for (Item item : items) {
MyObject myObject = new MyObject();
//use myObject.
}
подход Два:
MyObject myObject = null;
for (Item item : items) {
myObject = new MyObject();
//use myObject.
}
Я понимаю: «Сводя к минимуму объем локальных переменных, вы увеличиваете читаемость и ремонтопригодность кода и уменьшить вероятность ошибка". (Джошуа Блох).
Но как насчет производительности/потребления памяти? В объектах Java объекты собираются Мусором, когда нет ссылки на объект. Если есть, например, 100000 объектов, тогда будет создано 100000 объектов. В подходе 1 каждый объект будет иметь ссылку (myObject), чтобы они не имели права на GC?
Как и в подходе Два с каждой итерацией цикла вы удаляете ссылку с объекта, созданного на предыдущей итерации. поэтому, несомненно, объекты начинают становиться доступными после первой итерации цикла.
Или это компромисс между производительностью и удобочитаемостью кода & ремонтопригодность?
Что я неправильно понял?
Примечание: Предполагая, что я забочусь о производительности, и myObject не нужен после цикла.
Заранее спасибо
Производительность может быть проблемой, но гораздо лучше написать правильный код и поместить объявление переменной внутри цикла. * Затем ** измерять ** производительность. * Никогда «не оптимизируйте» все, пока не убедитесь, что это необходимо. Все остальное - безумие. – markspace
Я думаю, что GC достаточно умен, чтобы очистить эти объекты в подходе два после каждого цикла, если это необходимо. Я всегда предпочитаю подход, объявляющий переменную ближе к тому, где она используется. – Bohn
В обеих версиях создано 100000 объектов. Единственное различие между ними заключается в том, что последний созданный объект не подходит для GC, как только в одном из них. – EJP