Как Garbage Collector в Java определяет, какие объекты подлежат удалению?

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

Ответ

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

Основной алгоритм (Mark-and-Sweep):

  1. Mark (Пометка): GC начинает обход графа объектов от GC Roots (например, локальные переменные в стеке, статические поля, активные потоки) и помечает все достижимые объекты как живые.
  2. Sweep (Очистка): Память сканируется, и все непомеченные объекты считаются недостижимым мусором и удаляются.

Пример:

Object objA = new Object(); // Создан, ссылка из стека делает его достижимым
Object objB = new Object();
objA = null; // Объект, на который ссылался objA, теперь недостижим
// При следующем цикле сборки мусора этот объект будет помечен как мусор и удален.

Оптимизация (Generational GC): В HotSpot JVM используется разделение кучи на поколения (Young, Old). Это основано на эмпирическом наблюдении, что большинство объектов живут недолго. Сборка мусора чаще происходит в молодом поколении (Minor GC), что повышает общую эффективность.