Ответ
Garbage Collector (GC) определяет мусорные (удаляемые) объекты на основе концепции достижимости. Объект считается живым, если существует цепочка ссылок от так называемых корневых точек (GC Roots).
Основной алгоритм (Mark-and-Sweep):
- Mark (Пометка): GC начинает обход графа объектов от GC Roots (например, локальные переменные в стеке, статические поля, активные потоки) и помечает все достижимые объекты как живые.
- Sweep (Очистка): Память сканируется, и все непомеченные объекты считаются недостижимым мусором и удаляются.
Пример:
Object objA = new Object(); // Создан, ссылка из стека делает его достижимым
Object objB = new Object();
objA = null; // Объект, на который ссылался objA, теперь недостижим
// При следующем цикле сборки мусора этот объект будет помечен как мусор и удален.
Оптимизация (Generational GC): В HotSpot JVM используется разделение кучи на поколения (Young, Old). Это основано на эмпирическом наблюдении, что большинство объектов живут недолго. Сборка мусора чаще происходит в молодом поколении (Minor GC), что повышает общую эффективность.