Как в Java происходит очистка памяти (сборка мусора)?

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

Ответ

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

Принцип работы:

  1. Пометка: GC обходит граф объектов, помечая все достижимые.
  2. Очистка: Память, занятая неотмеченными (недостижимыми) объектами, освобождается.
  3. Компактизация (опционально): Выжившие объекты перемещаются для устранения фрагментации памяти.

Пример:

public class Example {
    public static void main(String[] args) {
        Object obj = new Object(); // Создан объект в куче.
        obj = null; // Ссылка потеряна. Объект становится кандидатом на удаление.
        System.gc(); // Запрос на выполнение сборки мусора (не гарантирует немедленный вызов).
    }
}

Типы сборщиков и настройка:

  • Serial GC: Для однопоточных приложений.
  • Parallel/Throughput GC: Многопоточный, оптимизирован для пропускной способности.
  • G1 GC (Garbage-First): Баланс между latency и throughput, делит кучу на регионы.
  • ZGC/Shenandoah: Низкие паузы (low-latency) для больших куч.

Алгоритм выбирается и настраивается через JVM-флаги (например, -XX:+UseG1GC).