Что такое сборщик мусора (Garbage Collector) в Java?

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

Ответ

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

Как это работает?

GC работает циклически, выполняя два основных действия:

  1. Обнаружение мусора (Mark): Определяет, какие объекты еще "живы" (достижимы из корневых точек — стеков, статических полей и т.д.). Все остальные считаются "мусором".
  2. Очистка памяти (Sweep/Collect): Освобождает память, занятую мусором.

Поколения объектов и алгоритмы

Память в JVM разделена на поколения для оптимизации работы GC:

  • Young Generation (Молодое): Сюда помещаются новые объекты. Частая, быстрая сборка (Minor GC). Алгоритмы: Copy (в Eden/Survivor пространствах).
  • Old Generation (Старое): Сюда перемещаются объекты, пережившие несколько сборок в Young. Редкая, но более долгая сборка (Major/Full GC). Алгоритмы: Mark-Sweep-Compact.

Пример работы

public class GCDemo {
    public static void main(String[] args) {
        // Объект создается в куче (Young Generation)
        Object obj1 = new Object();

        // Ссылка переназначается, старый объект становится кандидатом на удаление
        obj1 = new Object();

        // Явный вызов GC (НЕ гарантирует немедленную сборку!)
        System.gc(); // Это лишь предложение JVM

        // Объект становится недостижимым после выхода из области видимости
        if (true) {
            Object obj2 = new Object();
        } // obj2 теперь кандидат на сборку
    }
}

Преимущества и недостатки

Плюсы:

  • Удобство: Избавляет разработчика от ручного управления памятью (как в C/C++).
  • Безопасность: Предотвращает ошибки, связанные с "висячими" указателями и утечками памяти (хотя не все).

Минусы:

  • Непредсказуемость: Точный момент сборки не определен.
  • Накладные расходы: Процесс сборки потребляет вычислительные ресурсы (CPU), что может вызывать паузы (STW - Stop-The-World).
  • Сложность настройки: Для высоконагруженных систем требуется тонкая настройка параметров GC (-XX:+UseG1GC, -Xmx, -Xms).