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.