Sobes.tech
Middle+

Kako radi sakupljač smeća u programskom jeziku Go?

sobes.tech АИ

Одговор од АИ

Sakupljač smeća u Go zasnovan je na algoritmu označavanja i brisanja sa okidačem zasnovanim na dodeli memorije. Radi paralelno sa glavnim programom i minimizira pauze.

Ključne tačke:

  • Tri skupa boja:
    • Bela: Objekti koji nisu posećeni i potencijalno su smeće.
    • Siva: Objekti dostupni iz korena, ali još nisu skenirani.
    • Crna: Objekti dostupni iz korena i već skenirani.
  • Označavanje: Sakupljač počinje od korena (globalne promenljive, stek svake gorutine), označavajući dostupne objekte kao sivu. Zatim rekurzivno skenira sive objekte, označavajući kao sivu one do kojih su dostupni, a skenirani objekti postaju crni.
  • Faza STW (Stop-The-World) tokom označavanja: Kratko zaustavljanje izvršavanja svih gorutina na početku označavanja za pravljenje trenutne slike grafa objekata i na kraju za promenu stanja.
  • Paralelno označavanje: Većina označavanja se obavlja paralelno sa radom programa.
  • Brisanje: Nakon označavanja, svi ostali beli objekti smatraju se nedostupnim i oslobađaju se. Go ne zahteva eksplicitno nuliranje pokazivača.
// Primer: kada objekat postane nedostupan
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Objekat kreiran, dostupan
    _ = d1                 // Korišćenje objekta

    d1 = nil // Objekat više nije dostupan putem promenljive d1.
            // Sakupljač smeća ga može osloboditi u sledećem ciklusu.

    // Drugi objekti na koje niko ne ukazuje takođe mogu biti sakupljeni.
}
  • Okidač: Sakupljač se pokreće kada alocirana memorija pređe određeni prag, koji zavisi od prethodnog obima alocirane memorije. Podrazumevano, ovaj prag je dvostruko veći od prethodno korišćene memorije.
  • Cilj: Održavanje niske latencije izbegavanjem dužih pauza "Stop-The-World".
// Ponašanje sakupljača može se kontrolisati putem promenljivih okruženja
// na primer, postavljanjem GOGC=off, deaktivira se sakupljanje smeća.

Uopšteno, sakupljač smeća u Go je efikasan i zahteva minimalno učešće programera.