Sobes.tech
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):
        1. Mark (Žymėjimas): Eina per objektų grafą ir žymi visus prieinamus objektus.
        2. Sweep (Valymas): Antrasis praėjimas atmintyje ir nepažymėti objektai pašalinami.
        • Trūkumai: Atminties fragmentacija.
      • Mark and Compact (Žymėjimas ir suspaudimas):
        1. Mark (Žymėjimas): Kaip Mark and Sweep.
        2. 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.
  • 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.