Sobes.tech
Middle+

Jakie cechy ma garbage collector w Dart?

sobes.tech AI

Odpowiedź od AI

Garbage collector w Dart używa algorytmu Generational Garbage Collection.

Główne cechy:

  • Generacje: Obiekty dzielą się na dwie generacje:
    • Generacja młoda: Tu tworzone są nowe obiekty. Zbiórka w tej generacji jest szybsza i częstsza, ponieważ większość obiektów umiera niedługo po utworzeniu.
    • Generacja stara: Obiekty, które przetrwają kilka cykli zbiórki w generacji młodej, są przenoszone tutaj. Zbiórka w tej generacji jest rzadsza, ale trwa dłużej.
  • Obiekty żyjące: Obiekty w generacji młodej, na które wskazują inne obiekty, są uważane za "żyjące" i mogą być przeniesione do generacji starej.
  • Etapy zbiórki:
    • Minor GC: Szybka zbiórka obejmująca tylko obiekty w generacji młodej.
    • Major GC: Dłuższa zbiórka sprawdzająca obiekty w generacji starej.
  • Zalety generacyjnej zbiórki:
    • Optymalizacja dla obiektów krótkotrwałych: Większość śmieci jest szybko usuwana z generacji młodej.
    • Skracanie czasów przerw: Częste, krótkie przerwy na zbiórkę młodej generacji są mniej zauważalne niż rzadkie, ale długie przerwy na całą stertę.
  • Garbage collector Dart VM:
    • Używa hybrydowego podejścia, łączącego kopiowanie (copying collector) dla generacji młodej i oznaczanie i zagęszczanie (mark-and-sweep/compact) dla generacji starej.
    • Kopiujący zbieracz w generacji młodej szybko przenosi żywe obiekty do innego obszaru pamięci, efektywnie zwalniając aktualny.
    • Oznaczanie i zagęszczanie w generacji starej znajduje żywe obiekty i je przenosi, aby wyeliminować fragmentację pamięci.
    • Działa niezależnie od wątków interfejsu użytkownika, minimalizując blokady.
// Przykład tworzenia obiektów, które trafią do generacji młodej
class MyClass {
  String name;
  MyClass(this.name);
}

void main() {
  var obj1 = MyClass("Obiekt 1"); // Tworzone w generacji młodej
  var obj2 = MyClass("Obiekt 2"); // Tworzone w generacji młodej

  // Jeśli obiekty nie są utrzymywane przez referencje, mogą zostać zebrane
  // podczas następnej zbiórki w generacji młodej.

  // Jeśli te obiekty będą żyły długo i będą miały referencje,
  // mogą zostać przeniesione do generacji starej.
}