Есть ли в Dart сборщик мусора?

«Есть ли в Dart сборщик мусора?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Dart используется автоматический сборщик мусора (Garbage Collector). Он управляет выделением и освобождением памяти для объектов, создаваемых в приложении.

Принцип работы: Сборщик мусора Dart использует алгоритм достижимости. Объект считается живым, если на него существует цепочка ссылок из корневых объектов (например, из стека вызовов или статических переменных). Когда объект становится недостижимым, занимаемая им память может быть освобождена.

Пример:

void main() {
  var list = ['a', 'b', 'c']; // Создается объект List
  list = []; // На старый список больше нет ссылок, он становится кандидатом на удаление.
  // Сборщик мусора в фоне может освободить память, занятую первым списком.
}

Особенности в контексте Flutter:

  • Generational сборка: Dart использует поколенческий сборщик, который эффективно обрабатывает множество короткоживущих объектов, типичных для частых перестроек UI во Flutter.
  • Фоновый режим: Сборка мусора выполняется асинхронно, стараясь не блокировать основной поток (UI).
  • Отсутствие ручного управления: Программисту не нужно вручную освобождать память, что предотвращает целый класс ошибок, таких как утечки памяти или обращение к освобожденной памяти.
  • Принудительный вызов (dev only): Для отладки можно использовать import 'dart:developer' as developer; и вызвать developer.collectGarbage(), но в продакшене это не требуется и не рекомендуется.