← Назад к вопросам

Как Garbage Collector определяет мусорный объект?

1.2 Junior🔥 171 комментариев
#ООП и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

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

Основной принцип: Reachability Analysis

GC определяет мусорный объект через анализ достижимости (reachability). Объект считается мусором, если до него нельзя добраться из корневых объектов приложения.

Алгоритм Mark-and-Sweep

Dart использует Mark-and-Sweep алгоритм:

  1. MARK (маркирование) - GC начинает с корневого набора и рекурсивно маркирует все достижимые объекты
  2. SWEEP (очистка) - GC удаляет все объекты без пометки и освобождает память

Пример в коде Dart

void main() {
  var list = [1, 2, 3];
  var user = User(name: "John");
  printUser();
}

class User {
  final String name;
  User({required this.name});
}

void printUser() {
  var localUser = User(name: "Temp");
  print(localUser.name);
}

Поколенческая сборка мусора

Dart использует поколенческую стратегию для оптимизации производительности:

  • Молодое поколение (Young Generation) - новые объекты, проверяются часто
  • Старое поколение (Old Generation) - долгоживущие объекты, проверяются реже

Цикличные ссылки

GC справляется с циклическими ссылками автоматически, так как видит, что циклические объекты недостижимы из корневого набора и удаляет их вместе.

Финализаторы

Когда объект удаляется, можно запустить finalizer для очистки ресурсов:

class FileHandle {
  final String path;
  late final Finalizer _finalizer;
  
  FileHandle(this.path) {
    _finalizer = Finalizer<String>((filepath) {
      print("Cleanup: closing $filepath");
    });
    _finalizer.attach(this, path);
  }
}

Лучшие практики

  • Избегайте удержания больших объектов - явно устанавливайте ссылки в null
  • Используйте слабые ссылки (WeakReference) для кешей
  • Профилируйте память через DevTools Memory Profiler

GC Dart — это автоматический и надёжный механизм, освобождающий разработчика от ручного управления памятью.