От чего зависит время жизни объекта в памяти JVM?

«От чего зависит время жизни объекта в памяти JVM?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Время жизни объекта определяется наличием активных ссылок на него и работой Сборщика мусора (Garbage Collector, GC). Объект удаляется, когда становится недостижимым.

Ключевые факторы:

  1. Достижимость (Reachability):

    • Сильные ссылки (Strong Reference): Object obj = new Object(); — объект жив, пока существует такая ссылка.
    • Другие типы ссылок (Soft, Weak, Phantom) позволяют GC удалять объекты при определённых условиях, даже если ссылки есть.
  2. Область видимости (Scope):

    void method() {
        Object localObj = new Object(); // Создан в куче (heap)
    } // После выхода из метода ссылка `localObj` уничтожается в стеке.
      // Сам объект в куче становится кандидатом на удаление GC.
  3. Поколения памяти (Generations) и алгоритмы GC:

    • Young Generation (Eden, Survivor): Здесь создаются новые объекты. Частые, быстрые сборки (Minor GC). Короткоживущие объекты удаляются быстро.
    • Old Generation: Сюда перемещаются объекты, пережившие несколько сборок в Young Gen. Сборки здесь (Major/Full GC) происходят реже, но дольше.
    • Выбор GC (G1, ZGC, Shenandoah) влияет на паузы и стратегию определения «мертвых» объектов.
  4. Явные действия:

    • Присвоение 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), таких как активные потоки, статические поля, локальные переменные в стеке и т.д.