Может ли Garbage Collector (GC) удалить объект в Java, если на него нет активных ссылок?

«Может ли Garbage Collector (GC) удалить объект в Java, если на него нет активных ссылок?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может и сделает это. Основной критерий для сборки мусора — отсутствие достижимости объекта из так называемых "корней" (GC Roots). Если на объект нет сильных (strong) ссылок, он становится "недостижимым" и будет удален в одном из последующих циклов сборки мусора.

Пример:

public void someMethod() {
    Object object = new Object(); // 1. Создан объект, есть сильная ссылка 'object'.
    object = null;                // 2. Ссылка обнулена. Объект теперь недостижим.
    // 3. Объект помечен как подлежащий удалению. GC удалит его, когда сочтет нужным.
}

Важные уточнения:

  1. Не мгновенно: GC работает асинхронно. Удаление может произойти не сразу после обнуления ссылки.
  2. Циклические ссылки: Объекты, ссылающиеся друг на друга, но недостижимые из GC Roots, также будут удалены. Современные GC (начиная с mark-sweep) справляются с циклами.
  3. Метод finalize(): Его использование не рекомендуется, но если он переопределен, он даст объекту последний шанс "воскреснуть" (хотя это плохая практика) и отсрочит его удаление.