Как в Java определяется, что объект можно удалить при сборке мусора?

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

Ответ

Java использует механизм сборки мусора (Garbage Collection, GC), который удаляет объекты, ставшие недостижимыми. Объект считается недостижимым, если на него нет ссылок из активных точек программы:

  • Из стека вызовов (локальные переменные, параметры методов).
  • Из статических полей классов.
  • Из других достижимых объектов в куче.

Пример:

public class GarbageCollectionExample {
    public static void main(String[] args) {
        Object obj1 = new Object(); // Объект 1 достижим через `obj1`
        Object obj2 = new Object(); // Объект 2 достижим через `obj2`

        obj1 = obj2; // Теперь ссылка `obj1` указывает на Объект 2
        // На исходный Объект 1 больше нет ссылок → он недостижим и может быть удален GC.
    }
}

Ключевые моменты:

  • Автоматизм: GC работает в фоне, решение о запуске принимает JVM.
  • Достижимость: Удаляются только объекты, до которых невозможно «добраться» из корневых ссылок (Root Set).
  • Явный вызов: System.gc() лишь предлагает JVM выполнить сборку, но не гарантирует её немедленное выполнение или удаление конкретного объекта.