Что такое garbage collector?

Garbage Collector (GC) — это встроенный в Java механизм, который автоматически управляет памятью, находя и удаляя объекты, больше не используемые программой, чтобы освободить пространство в куче (heap) и избежать утечек памяти.

🔍 Основная цель GC

  • Удалять "мусор" — объекты, на которые уже не существует активных ссылок.

  • Освобождать оперативную память без участия разработчика.

  • Поддерживать жизнеспособность и производительность приложения.

📦 Как работает Garbage Collector

GC периодически выполняет анализ кучи и ищет объекты, которые:

  1. Не достижимы от активных ссылок (GC Roots).

  2. Не используются кодом — на них нельзя сослаться.

Такие объекты считаются "мертвыми" и подлежат удалению.

🚀 Основные этапы работы GC

  1. **Маркировка (Marking):
    **

    • GC начинает с GC Roots (локальные переменные, статические поля, активные потоки) и отмечает все доступные объекты.

    • Всё, до чего нельзя дойти, считается мусором.

  2. **Очистка (Sweeping):
    **

    • Удаляются все неотмеченные (недостижимые) объекты.
  3. **Компактинг (Compacting):
    **

    • Оставшиеся объекты перемещаются ближе друг к другу, чтобы избежать фрагментации памяти.

🧠 Где работает GC

Garbage Collector управляет кучей (heap) — областью памяти, где хранятся объекты, созданные с помощью new.

Куча делится на поколения:

  • Young Generation (молодое поколение) — недавно созданные объекты. GC работает здесь чаще и быстро.

    • Подразделяется на Eden и Survivor области.
  • Old Generation (старое поколение) — объекты, прожившие несколько сборок. GC работает здесь реже, но дольше.

  • Metaspace (с Java 8+) — хранит метаданные классов, не управляется классическим GC, но может быть очищена.

🔄 Когда объект удаляется?

Когда на объект не ссылается ни одна переменная, и он не достижим от GC Roots, он считается "мертвым" и будет удалён.

Пример:

User user = new User();
user = null; // объект становится недостижимым и может быть удалён GC

⚙️ Алгоритмы GC в Java

Java поддерживает несколько реализаций сборщиков мусора:

Сборщик Описание
Serial GC Однопоточный, простейший, для небольших приложений
--- ---
Parallel GC Многопоточный, используется по умолчанию
--- ---
CMS Concurrent Mark-Sweep — минимизирует паузы (устарел)
--- ---
G1 GC Garbage First — адаптивный, сбалансированный
--- ---
ZGC и Shenandoah Низкопаузные, для крупных систем и real-time
--- ---

Выбор GC можно задавать флагами JVM (например, -XX:+UseG1GC).

⚠️ Что GC не делает

  • Не освобождает ресурсы вне памяти, как файлы, сетевые соединения — это обязанность разработчика (try-with-resources, close()).

  • Не удаляет объекты сразу, как только они становятся недостижимыми.

  • Не предотвращает утечки памяти, если ссылки остаются (например, в статических переменных или слушателях).

📌 Почему GC — это преимущество

  • Меньше ошибок: не нужно вручную освобождать память, как в C/C++.

  • Больше безопасности: защита от двойного освобождения и dangling pointers.

  • Автоматическое управление памятью — ускоряет разработку.

🧠 Кратко

Garbage Collector — это механизм в Java, который освобождает память, автоматически удаляя неиспользуемые объекты из кучи. Он делает программы безопаснее, устойчивее и избавляет разработчика от ручного управления памятью.