Что такое garbage collector?
Garbage Collector (GC) — это встроенный в Java механизм, который автоматически управляет памятью, находя и удаляя объекты, больше не используемые программой, чтобы освободить пространство в куче (heap) и избежать утечек памяти.
🔍 Основная цель GC
-
Удалять "мусор" — объекты, на которые уже не существует активных ссылок.
-
Освобождать оперативную память без участия разработчика.
-
Поддерживать жизнеспособность и производительность приложения.
📦 Как работает Garbage Collector
GC периодически выполняет анализ кучи и ищет объекты, которые:
-
Не достижимы от активных ссылок (GC Roots).
-
Не используются кодом — на них нельзя сослаться.
Такие объекты считаются "мертвыми" и подлежат удалению.
🚀 Основные этапы работы GC
-
**Маркировка (Marking):
**-
GC начинает с GC Roots (локальные переменные, статические поля, активные потоки) и отмечает все доступные объекты.
-
Всё, до чего нельзя дойти, считается мусором.
-
-
**Очистка (Sweeping):
**- Удаляются все неотмеченные (недостижимые) объекты.
-
**Компактинг (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, который освобождает память, автоматически удаляя неиспользуемые объекты из кучи. Он делает программы безопаснее, устойчивее и избавляет разработчика от ручного управления памятью.