Зачем нужен сборщик мусора (Garbage Collector)?
Сборщик мусора (Garbage Collector, GC) в Java — это автоматический механизм управления памятью, который освобождает память, занятую объектами, более не используемыми приложением. Его основная задача — предотвращать утечки памяти и избавлять разработчика от необходимости вручную освобождать ресурсы, как это делают, например, в C или C++.
📌 Зачем он нужен
1. Автоматическое управление памятью
Java — язык с автоматической сборкой мусора, что означает:
-
Объекты создаются динамически (через new).
-
Когда объект больше не нужен (недостижим из кода) — он считается "мусором".
-
GC отслеживает такие объекты и удаляет их, освобождая место в куче (heap).
Это снижает вероятность:
-
Утечек памяти (memory leaks)
-
Ошибок двойного освобождения
-
"Зависших" ссылок
2. Повышение надёжности и безопасности кода
Без GC разработчик должен вручную управлять жизненным циклом объектов. Это приводит к:
-
Сложным багам (утечки, dangling pointers)
-
Проблемам многопоточности
-
Повышенной сложности при масштабировании
Garbage Collector автоматизирует эту задачу и снижает риск ошибок.
3. Обеспечение высокой доступности памяти
Когда память заканчивается, GC пытается:
-
Освободить неиспользуемые объекты
-
Уменьшить частоту OutOfMemoryError
-
Увеличить продолжительность жизни приложения без рестартов
⚙️ Как GC определяет, что объект "мусор"
Объект считается мусором, если на него невозможно сослаться из активного кода (например, он не достижим из корневых ссылок — GC Roots):
-
Статические переменные
-
Локальные переменные на стеке
-
Регистрируемые объекты в JNI
-
Активные потоки
🔁 Пример:
public void example() {
MyObject obj = new MyObject(); // доступен
obj = null; // теперь не достижим
}
После obj = null объект становится кандидатом на удаление — GC может его очистить.
🔄 Основные этапы работы сборщика мусора
-
Маркировка (Mark) — GC ищет все объекты, на которые есть живые ссылки.
-
Очистка (Sweep) — удаляются объекты без ссылок.
-
Компактинг (Compacting) — освобождённое пространство дефрагментируется.
📥 Где работает GC
-
В области Heap памяти (куча), где живут все объекты.
-
Heap делится на:
-
Young Generation (Eden, Survivor) — объекты "молодого возраста"
-
Old Generation (Tenured) — "старые" объекты, живущие дольше
-
Permanent/Metaspace — классы, методы и прочие метаданные
-
🔬 Типы сборщиков мусора в Java
Java предоставляет разные GC-алгоритмы (в зависимости от версии JVM):
-
Serial GC — однопоточный, для небольших приложений
-
Parallel GC — многопоточный, по умолчанию в большинстве JVM
-
CMS (Concurrent Mark-Sweep) — устарел, заменён на G1
-
G1 GC (Garbage-First) — приоритетен с Java 9+
-
ZGC / Shenandoah — низкопаузные сборщики для высоконагруженных систем
🧠 Примеры практической пользы
-
Автоматически удаляются объекты Activity, которые больше не в back stack.
-
При закрытии фрагмента его View и привязанные данные могут быть удалены GC.
-
Утечки памяти легче отлавливать: если GC не удаляет объект — возможно, осталась лишняя ссылка.
❗ Возможные проблемы, несмотря на GC
-
Утечки памяти всё равно возможны, если:
-
Утечка через static ссылку
-
Слушатели не удаляются
-
Замыкания (lambda) держат ссылку на Activity
-
-
GC Stop-The-World (STW) — на момент сборки поток останавливается, возможна задержка UI
-
Частые сборки — признак плохого управления памятью (например, если в цикле создаются объекты без нужды)
Таким образом, сборщик мусора в Java — это основа безопасности, устойчивости и удобства разработки, позволяющая автоматически управлять памятью, снижать количество ошибок и упрощать сопровождение приложений.