Что происходит в JVM во время выполнения сборки мусора (Garbage Collection)?

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

Ответ

Сборка мусора (GC) — процесс освобождения памяти, занятой объектами, которые больше не достижимы из работающего кода (корневых ссылок). Основные фазы большинства сборщиков:

  1. Mark (Пометка): GC начинает с корней GC (Garbage Collection Roots), таких как статические поля, локальные переменные в активных методах, потоки и т.д., и рекурсивно помечает все достижимые объекты как "живые".
  2. Sweep (Очистка): Память сканируется, и объекты, не помеченные как живые, считаются мусором и подлежат удалению.
  3. Compact (Уплотнение) (опционально): Живые объекты перемещаются в начало области памяти, чтобы устранить фрагментацию и выделять память для новых объектов быстрее.

Ключевое воздействие на приложение: Большинство алгоритмов GC требуют остановки всех потоков приложения (Stop-The-World пауза) на время выполнения некоторых или всех фаз. Длительность паузы зависит от алгоритма и размера кучи.

Пример запроса GC (не гарантирует немедленный вызов):

// Создание мусора
List<Object> list = new ArrayList<>();
for (int i = 0; i < 100_000; i++) {
    list.add(new Object());
}
list = null; // Объекты становятся недостижимыми
System.gc(); // Подсказка JVM, что можно выполнить сборку

Типы сборщиков: Различаются стратегиями минимизации пауз (например, G1 и ZGC предназначены для больших куч с предсказуемыми короткими паузами).