Sobes.tech
Middle+

Kokios savybės turi Dart atliekų surinkėjas?

sobes.tech AI

Atsakymas iš AI

Dart atlieka šiukšlių rinkėją, naudojant generacinį šiukšlių rinkimo algoritmą (Generational Garbage Collection).

Pagrindinės savybės:

  • Kūriniai (Generations): Objekti skirstomi į du kartus:
    • Jaunasis kartas (Young Generation): Čia kuriami nauji objektai. Šiukšlių rinkimas šiame kartoje yra greitesnis ir dažnesnis, nes dauguma objektų miršta netrukus po sukūrimo.
    • Senasis kartas (Old Generation): Objekti, kurie "išgyveno" kelis šiukšlių rinkimo ciklus jaunajame kartyje, perkeliami čia. Šiukšlių rinkimas šiame kartoje yra retesnis, bet užtrunka ilgiau.
  • Išgyvenusios (Survivors): Jaunajame kartyje esantys objektai, į kuriuos kreipiasi kiti objektai, laikomi "išgyvenusiais" ir gali būti perkeliami į senąjį kartą.
  • Rinkimo etapai:
    • Minor GC (Mažasis GC): Greitas rinkimas, apimantis tik jaunajame kartyje esančius objektus.
    • Major GC (Didysis GC): Ilgesnis rinkimas, tikrinantis senajame kartyje esančius objektus.
  • Generacinio šiukšlių rinkimo privalumai:
    • Optimizacija trumpalaikiams objektams: Dauguma šiukšlių greitai pašalinama iš jaunojo karto.
    • Laiko sutaupymas pertraukomis: Dažnos, bet trumpos pertraukos jaunajame kartyje yra mažiau pastebimos nei retos, bet ilgesnės pertraukos visame atmintyje.
  • Dart VM šiukšlių rinkėjas:
    • Naudoja hibridinį požiūrį, jungiantį kopijavimą (copying collector) jaunajam kartui ir žymėjimą ir perkėlimą (mark-and-sweep/compact) senajam kartui.
    • Kopijuojantis rinkėjas greitai perkelia gyvus objektus į kitą atminties sritį, efektyviai išlaisvindamas esamą.
    • Žymėjimas ir perkėlimas senajame kartyje suranda gyvus objektus ir juos perkelia, siekiant sumažinti atminties fragmentaciją.
    • Veikia nepriklausomai nuo vartotojo sąsajos srautų, minimalizuodamas užblokavimus.
// Pavyzdys, kaip kurti objektus, kurie priklauso jaunajam kartui
class MyClass {
  String name;
  MyClass(this.name);
}

void main() {
  var obj1 = MyClass("Object 1"); // Sukurtas jaunajame kartyje
  var obj2 = MyClass("Object 2"); // Sukurtas jaunajame kartyje

  // Jei objektai nėra išlaikomi nuorodomis, jie gali būti surinkti
  // kitame rinkimo cikle jaunajame kartyje.

  // Jei šie objektai gyvens ilgai ir turės nuorodas,
  // jie gali būti perkeliami į senąjį kartą.
}