Что такое Garbage Collector в Dart?

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

Ответ

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

  • Молодое поколение (Young Generation): Использует быстрый алгоритм scavenger для очистки короткоживущих объектов (например, временных переменных в методе build). Сборка мусора здесь происходит часто и быстро.
  • Старое поколение (Old Generation): Для долгоживущих объектов используется более медленный алгоритм (mark-sweep или mark-compact).

Практическое влияние на Flutter:

  • Микрофризы (jank): Длительная сборка мусора в основном потоке может вызвать пропуск кадров. Это критично для анимаций и скроллинга.
  • Оптимизации:
    • Избегайте создания лишних объектов в часто вызываемых методах (build, didUpdateWidget, анимационных листенерах). Используйте const конструкторы для виджетов.
    • Для отложенной инициализации тяжёлых объектов используйте late final.
    • Управляйте подписками (StreamSubscription, Listenable) и явно отменяйте их в dispose, чтобы объекты стали недостижимыми раньше.

Пример плохой и хорошей практики:

// Плохо: Создаёт новый список на каждом вызове build
Widget build(BuildContext context) {
  List<Widget> items = []; // Новый объект каждый кадр
  for (var i = 0; i < 100; i++) {
    items.add(Text('Item $i'));
  }
  return ListView(children: items);
}

// Лучше: Кэширование списка (если данные статичны)
class MyWidget extends StatelessWidget {
  final List<Widget> _cachedItems = List.generate(
    100,
    (i) => Text('Item $i'),
  );

  @override
  Widget build(BuildContext context) {
    return ListView(children: _cachedItems);
  }
}