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ą.
}