Ответ
Время жизни объекта определяется наличием активных ссылок на него и работой Сборщика мусора (Garbage Collector, GC). Объект удаляется, когда становится недостижимым.
Ключевые факторы:
-
Достижимость (Reachability):
- Сильные ссылки (Strong Reference):
Object obj = new Object();— объект жив, пока существует такая ссылка. - Другие типы ссылок (Soft, Weak, Phantom) позволяют GC удалять объекты при определённых условиях, даже если ссылки есть.
- Сильные ссылки (Strong Reference):
-
Область видимости (Scope):
void method() { Object localObj = new Object(); // Создан в куче (heap) } // После выхода из метода ссылка `localObj` уничтожается в стеке. // Сам объект в куче становится кандидатом на удаление GC. -
Поколения памяти (Generations) и алгоритмы GC:
- Young Generation (Eden, Survivor): Здесь создаются новые объекты. Частые, быстрые сборки (Minor GC). Короткоживущие объекты удаляются быстро.
- Old Generation: Сюда перемещаются объекты, пережившие несколько сборок в Young Gen. Сборки здесь (Major/Full GC) происходят реже, но дольше.
- Выбор GC (G1, ZGC, Shenandoah) влияет на паузы и стратегию определения «мертвых» объектов.
-
Явные действия:
- Присвоение
nullссылке:obj = null; - Переприсвоение ссылки:
obj = new Object();(старый объект теряет ссылку).
- Присвоение
Пример жизненного цикла:
class Processor {
private Cache cache; // Поле класса, ссылка живёт пока живёт экземпляр Processor
void process() {
Data data = loadData(); // data — локальная ссылка
Result r = calculate(data); // r — локальная ссылка
// После выхода из метода ссылки `data` и `r` исчезают из стека.
// Соответствующие объекты Data и Result могут быть собраны GC.
}
}
// Когда экземпляр Processor станет недостижим, объект Cache также может быть собран.
Итог: Объект живёт, пока существует цепочка сильных ссылок от корней GC (Garbage Collection Roots), таких как активные потоки, статические поля, локальные переменные в стеке и т.д.