Какую функцию выполняет Garbage Collector (GC) в Java?

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

Ответ

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

Принцип работы (упрощённо):

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

Ключевые области памяти и алгоритмы GC:

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

Типы сборщиков в HotSpot JVM:

  • Serial GC: Один поток, для приложений с малым объёмом данных.
  • Parallel GC (Throughput): Несколько потоков, максимизирует пропускную способность.
  • CMS (Concurrent Mark Sweep): Пытается минимизировать паузы, выполняя часть работы параллельно с приложением (устарел).
  • G1 (Garbage-First): Разделяет кучу на регионы, собирает регионы с наибольшим количеством мусора. Баланс между паузами и пропускной способностью.
  • ZGC / Shenandoah: Низколатентные сборщики, цель — паузы не более 10 мс даже для очень больших куч.

Что GC НЕ гарантирует:

  • Моментальное удаление объекта после обнуления ссылок.
  • Вызов finalize() (метод deprecated с Java 9).
  • Освобождение памяти при утечках в стиле «логической» (например, добавление объектов в статическую коллекцию и забывание об их удалении).