Ответ
Garbage Collector (GC, Сборщик мусора) — это автоматический менеджер памяти в JVM. Его основная задача — освобождать память в куче (Heap), удаляя объекты, которые больше не используются программой, тем самым предотвращая утечки памяти.
Принцип работы (упрощённо):
- Обнаружение мусора: GC определяет, какие объекты достижимы (на них есть ссылки из активных потоков, статических полей, JNI и т.д.), а какие недостижимы (мусор).
- Освобождение памяти: Память, занятая недостижимыми объектами, освобождается.
- Компактизация (опционально): Некоторые 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). - Освобождение памяти при утечках в стиле «логической» (например, добавление объектов в статическую коллекцию и забывание об их удалении).