Основные особенности сборщика мусора (Garbage Collector):
- Автоматизация управления памятью: Освобождает разработчика от ручного выделения / освобождения памяти, снижая риск ошибок типа "memory leaks" или "dangling pointers".
- Определение "мертвых" объектов: Использует алгоритмы для выявления объектов, которые больше не используются (недоступны из корневых ссылок).
- Различные алгоритмы сборки:
- Mark-and-Sweep: Помечает используемые объекты (Mark), затем удаляет непомеченные (Sweep). Может приводить к фрагментации памяти.
- Copying: Делит память на два пространства. Перемещает живые объекты из активного пространства в неактивное, затем очищает все активное. Эффективен при большом количестве "мертвых" объектов, но требует больше памяти.
- Mark-and-Compact: Помечает используемые объекты (Mark), затем перемещает их в начало кучи (Compact), освобождая непрерывный блок памяти. Предотвращает фрагментацию.
- Generational: Делит кучу на поколения (Young, Old). Чаще собирает мусор в "молодом" поколении, где объекты живут меньше. Эффективно снижает нагрузку.
- Stop-the-World (STW) паузы: Некоторые алгоритмы сборки требуют приостановки выполнения программы для корректной работы, что может вызывать задержки. Современные GC стремятся минимизировать эти паузы (например, G1, ZGC).
- Непредсказуемость момента сборки: Разработчик обычно не контролирует точный момент срабатывания сборщика мусора, хотя может влиять на него косвенно.
- Нагрузка на производительность: Сам процесс сборки мусора потребляет ресурсы CPU и RAM. Выбор алгоритма и настройка GC влияют на производительность приложения.