Зачем нужен сборщик мусора (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 может его очистить.

🔄 Основные этапы работы сборщика мусора

  1. Маркировка (Mark) — GC ищет все объекты, на которые есть живые ссылки.

  2. Очистка (Sweep) — удаляются объекты без ссылок.

  3. Компактинг (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 — это основа безопасности, устойчивости и удобства разработки, позволяющая автоматически управлять памятью, снижать количество ошибок и упрощать сопровождение приложений.