Sobes.tech
Middle

Co wiesz o zbieraczu śmieci w Dart?

sobes.tech AI

Odpowiedź od AI

Dart używa jednordzeniowego zbieracza śmieci opartego na kolekcji generacyjnej.

Kluczowe cechy:

  • Kolekcja generacyjna: Obiekty dzielą się na dwie generacje:
    • Generacja młoda: Nowe, krótkotrwałe obiekty. Są często zbierane.
    • Generacja stara: Długotrwałe obiekty, które przetrwały kilka zbiórek w generacji młodej. Są zbierane rzadziej.
  • Stop-the-World: Aby wykonać zbieranie śmieci, konieczne jest zatrzymanie wykonywania programu (Dart Isolates). Jednak dzięki jednordzeniowości i optymalizacjom opóźnienia są minimalne.
  • Mark-and-Sweep: W starej generacji używany jest algorytm Mark-and-Sweep. Najpierw oznacza się dostępne obiekty, potem usuwa się nieosiągalne. Dla młodej generacji używany jest algorytm Copying Collector, który szybko przenosi żywe obiekty do innej przestrzeni pamięci.
  • Brak cykli zbierania śmieci: Programista nie musi ręcznie zarządzać pamięcią ani wywoływać GC. System robi to automatycznie.
  • Optymalizacje: Obejmują inlining funkcji, specjalizację typów i alokację obiektów na stosie, co zmniejsza obciążenie zbieracza śmieci.

Na przykład, podczas tworzenia nowego obiektu:

// Tworzenie nowego obiektu w "młodej" generacji pamięci
var myObject = MyClass();

Jeśli myObject pozostanie w pamięci i będzie dostępny przez długi czas, z czasem zostanie przeniesiony do "starej" generacji. Jeśli przestanie być dostępny, zbieracz śmieci go w końcu zwolni.

// myObject jest teraz nieosiągalny, może zostać zebrany przez GC
myObject = null;

Ważne jest, aby zrozumieć, że zbieracz śmieci w Dart jest wydajny, ale nie jest panaceum na wycieki pamięci, które mogą wystąpić z powodu utrzymywania silnych referencji do obiektów, które nie są już potrzebne (np. nieanulowane subskrypcje).