Middle+
Ako funguje zberač odpadkov v programovacom jazyku Go?
sobes.tech AI
Odpoveď od AI
Zberač odpadkov v Go temelji na algoritmu označevanja in brisanja z sprožilcem, ki temelji na dodeljevanju pomnilnika. Deluje vzporedno z glavnim programom in minimizira pavze.
Ključne točke:
- Tri skupine barv:
- Bela: Objekti, ki niso obiskani in potencialno so odpadki.
- Siva: Objekti dostopni iz korenin, a še niso skenirani.
- Črna: Objekti dostopni iz korenin in že skenirani.
- Označevanje: Zbiralnik začne od korenin (globalne spremenljivke, sklad vsake goroutine), označuje dostopne objekte kot sivo. Nato rekurzivno skenira sive objekte, označuje kot sivo tiste, do katerih so dostopni, in skenirane objekte postane črne.
- Faza STW (Stop-The-World) med označevanjem: Kratka ustavitev izvajanja vseh goroutine-ov na začetku označevanja za ustvarjanje posnetka grafa objektov in na koncu za spremembo stanja.
- Paralelno označevanje: Večina označevanja poteka vzporedno z delovanjem programa.
- Brisanje: Po označevanju vsi ostali beli objekti, ki ostanejo, veljajo za nedostopne in se sprostijo. Go ne zahteva eksplicitnega ničelnega nastavka kazalcev.
// Primer: ko objekt postane nedostopen
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Objekt ustvarjen, dostopen
_ = d1 // Uporaba objekta
d1 = nil // Objekt ni več dostopen prek spremenljivke d1.
// Zbiralnik odpadkov ga lahko sprosti v naslednjem ciklu.
// Drugi objekti, na katere nihče ne kaže, so prav tako lahko zbrani.
}
- Sprožilec: Zbiralnik se aktivira, ko presegne določeni prag, ki je odvisen od prejšnjega obsega dodeljenega pomnilnika. Privzeto je ta prag dvakrat večji od prejšnje porabljene količine.
- Cilj: Ohraniti nizko zakasnitev z izogibanjem dolgim pavzam "Stop-The-World".
// Obnašanje zbiralnika je mogoče nadzorovati z okolijskimi spremenljivkami
// na primer z nastavitvijo GOGC=off, se onemogoči zbiranje odpadkov.
Na splošno je zbiralnik odpadkov v Go učinkovit in zahteva minimalno sodelovanje razvijalca.