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