Sobes.tech
Middle+

Milyen jellemzői vannak a Dart szemétgyűjtőjének?

sobes.tech MI

Válasz az MI-től

A Dart szemétgyűjtő algoritmusa a Generációs szemétgyűjtés (Generational Garbage Collection).

Fő jellemzők:

  • Generációk: Az objektumokat két generációra osztják:
    • Fiatal generáció: Itt jönnek létre az új objektumok. A gyűjtés ebben a generációban gyorsabb és gyakoribb, mivel a legtöbb objektum rövid idő után elpusztul.
    • Régi generáció: Azok az objektumok, amelyek több gyűjtési cikluson át megmaradnak a fiatal generációban, ide kerülnek. A gyűjtés ritkábban történik, de hosszabb ideig tart.
  • Élő példányok: A fiatal generációban lévő, más objektumokra mutató objektumokat "élő" példányoknak tekintjük, és át lehet őket helyezni a régi generációba.
  • Gyűjtési szakaszok:
    • Minor GC: Gyors gyűjtés, amely csak a fiatal generáció objektumait érinti.
    • Major GC: Hosszabb gyűjtés, amely a régi generáció objektumait ellenőrzi.
  • A generációs gyűjtés előnyei:
    • Optimalizálás rövid életű objektumokra: A szemét nagy része gyorsan eltávolításra kerül a fiatal generációból.
    • A szünetek időtartamának csökkentése: Gyakori, rövid szünetek a fiatal generáció gyűjtésekor kevésbé észrevehetők, mint a ritka, de hosszú szünetek az egész heap esetében.
  • Dart VM szemétgyűjtő:
    • Egy hibrid megközelítést alkalmaz, amely másolós (copying collector) a fiatal generációhoz és jelölős és tömörítő (mark-and-sweep/compact) a régi generációhoz.
    • A másolós gyűjtő gyorsan áthelyezi az élő objektumokat egy másik memória területre, hatékonyan felszabadítva a jelenlegi területet.
    • A jelölés és tömörítés a régi generációban megtalálja az élő objektumokat, és átmozgatja őket a memória fragmentációjának kiküszöbölése érdekében.
    • Működik felhasználói felület szálaktól függetlenül, minimalizálva a blokkolásokat.
// Példa az objektumok létrehozására, amelyek a fiatal generációba kerülnek
class MyClass {
  String name;
  MyClass(this.name);
}

void main() {
  var obj1 = MyClass("Objektum 1"); // Létrehozva a fiatal generációban
  var obj2 = MyClass("Objektum 2"); // Létrehozva a fiatal generációban

  // Ha az objektumokat nem tartják fenn referenciák, akkor gyűjthetők
  // a következő fiatal generációs gyűjtés során.

  // Ha ezek az objektumok hosszú ideig élnek és referenciákkal rendelkeznek,
  // akkor át lehet őket helyezni a régi generációba.
}