Короткий ответ
Сборка мусора — автоматический процесс управления памятью: JVM сама находит объекты в куче, до которых нельзя добраться по цепочке ссылок от корневых точек (корней), и освобождает их память. Программисту не нужно вручную удалять объекты, как через free или delete в C/C++.
Как это работает подробнее
Базовый алгоритм — mark-and-sweep: на первом шаге GC обходит граф объектов от корней и помечает достижимые, на втором удаляет непомеченные. В современных HotSpot JVM куча разделена на поколения: молодые объекты «умирают» быстро, для них применяется копирующая сборка с частыми небольшими паузами, а выжившие со временем переходят в старое поколение, где работают другие алгоритмы.
- Корни (GC roots) — локальные переменные активных потоков, статические поля и другие точки входа в граф объектов.
- Достижимость — объект жив, пока до него можно добраться от корней; недостижимые объекты удаляются.
- Поколения — young и old generation: для молодых объектов частая копирующая сборка, для старых — отдельные стратегии.
- System.gc() — лишь рекомендация запустить GC; JVM может её проигнорировать.
Пример кода
GcDemo.java
public class GcDemo {
public static void main(String[] args) {
Object o = new Object(); // объект создан в куче
o = null; // ссылки нет — объект становится недостижимым
System.gc(); // лишь рекомендация запустить GC
}
}Что использовать на практике
- Не вызывай System.gc() в продакшене: это рекомендация, а не гарантия, и она может ухудшить производительность.
- Полагайся на автоматическую сборку и следи за достижимостью объектов — утечки создают случайно сохранённые ссылки.
- Для диагностики используй логи GC и анализаторы кучи, а не ручное управление памятью.