Middle
Papaskinkite apie šiukšlių surinkimo metodus (Garbage Collector).
sobes.tech AI
Atsakymas iš AI
Atliekų surinkimo metodai:
- Reference Counting (Nuorodų skaičiavimas): Kiekvienas objektas saugo nuorodų skaitiklį. Kai skaitiklis pasiekia nulį, objektas laikomas šiukšle ir pašalinamas.
- Privalumai: Paprasta, nesustabdys pagrindinės programos veikimo ilgai.
- Trūkumai: Negali spręsti ciklinių nuorodų; reikalauja papildomos vietos kiekvienam objektui skaitiklio.
- Tracing Garbage Collectors (Traukimo šiukšlių surinkėjai): Pradedama nuo "šaknų" objektų (pvz., aktyvių kintamųjų, iškvietimų steko) ir rekursyviai tikrinami visi prieinami iš šių šaknų objektai. Nepasiekiami objektai laikomi šiukšle.
- Pagrindinės strategijos:
- Mark and Sweep (Žymėjimas ir valymas):
- Mark (Žymėjimas): Eina per objektų grafą ir žymi visus prieinamus objektus.
- Sweep (Valymas): Antrasis praėjimas atmintyje ir nepažymėti objektai pašalinami.
- Trūkumai: Atminties fragmentacija.
- Mark and Compact (Žymėjimas ir suspaudimas):
- Mark (Žymėjimas): Kaip Mark and Sweep.
- Compact (Suspaudimas): Perkelia gyvus objektus, kad jie būtų išdėstyti nuosekliai, pašalindami fragmentaciją.
- Trūkumai: Sudėtingesnis, gali reikėti sustabdyti programos vykdymą.
- Copying (Kopijavimas): Atmintis padalinta į dvi sritis (pusės erdvės). Kiekvieno surinkimo metu gyvi objektai iš vienos srities kopijuojami į kitą. Tada sena sritis visiškai išvaloma.
- Privalumai: Nėra fragmentacijos, greitas atminties paskirstymas po surinkimo.
- Trūkumai: Reikalauja dvigubai daugiau atminties nei aktyviai naudojama.
- Mark and Sweep (Žymėjimas ir valymas):
- Pagrindinės strategijos:
- Generation Garbage Collection (Generacinis šiukšlių surinkimas): Remiasi prielaida, kad dauguma objektų gyvena trumpai. Atmintis padalinta į kartas (jauna, sena). Objektai priskiriami jaunai kartai kuriant. Jei objektas "išgyvena" kelis surinkimus jaunoje kartoje, jis perkeliama į senąją. Surinkimas dažniau vyksta jaunoje kartoje.
- Privalumai: Efektyvus, nes didžioji dalis darbo atliekama jaunoje kartoje su mažais duomenų kiekiais.
- Trūkumai: Reikalauja stebėti nuorodas iš senų į jaunąsias kartas (pvz., naudojant korteles ar kitus mechanizmus).
Pavyzdžiai kalbų ir jų GC:
- Python: Reference Counting (su cikliniais surinkimais).
- Java, C#: Generational, Mark and Sweep, Mark and Compact, Copying.
- Go: Konkurentinis, ne-generacinis Mark and Sweep su optimizacijomis.