Dart использует однопоточный сборщик мусора, основанный на поколенческой сборке (generational garbage collection).
Ключевые особенности:
- Generational Collection: Объекты делятся на два поколения:
- Young generation: Новые, короткоживущие объекты. Собираются часто.
- Old generation: Долгоживущие объекты, пережившие несколько сборок в молодом поколении. Собираются реже.
- Stop-the-World: Для выполнения сборки мусора требуется приостанавливать выполнение программы (Dart Isolates). Однако, благодаря однопоточности и оптимизациям, задержки минимизируются.
- Mark-and-Sweep: В старом поколении используется алгоритм Mark-and-Sweep. Сначала помечаются достижимые объекты, затем удаляются недостижимые. Для молодого поколения используется алгоритм Copying Collector, который быстро перемещает живые объекты в другое пространство памяти.
- Нет циклов сборки мусора: Разработчику не нужно вручную управлять памятью или вызывать GC. Система делает это автоматически.
- Оптимизации: Включают инлайнинг функций, специализацию типов и выделение объектов в стеке, что снижает нагрузку на сборщик мусора.
Например, при создании нового объекта:
dart
Если myObject надолго остается в памяти и доступен, он со временем будет перемещен в "старое" поколение. Если же он перестанет быть достижимым, сборщик мусора его рано или поздно освободит.
dart
Важно понимать, что сборщик мусора в Dart эффективен, но не является панацеей от утечек памяти, которые могут возникнуть из-за сохранения сильных ссылок на объекты, которые больше не нужны (например, подписки, которые не были отменены).