Middle+
Kuidas töötab prügikorjaja Go programmeerimiskeeles?
sobes.tech AI
Vastus AI-lt
Go prügikorjaja põhineb märgistamise-kustutamise algoritmil, millel on mälu eraldamise trigereid. See töötab paralleelselt peamise programmiga ja minimeerib pausid:
Peamised punktid:
- Kolm värvi komplekti:
- Valge: Objektid, mida pole külastatud ja mis võivad olla prügi:
- Hall: Objektid, mis on juurdepääsetavad juurtest, kuid veel skaneerimata:
- Must: Objektid, mis on juurdepääsetavad juurtest ja juba skaneeritud:
- Märgistus: Korjaja alustab juurtest (globaalsetest muutujatest, iga gorutini virnast), märgistades juurdepääsetavad objektid halliks. Seejärel skaneerib ta rekursiivselt hallid objektid, märgistades nende kaudu saavutatavad objektid halliks ning skaneeritavad objektid muutuvad mustaks:
- STW faas (Lõpeta-Maailmas) märgistamise ajal: Lühike peatamine kõigi gorutinite alguses, et luua objektide graafi hetkepilt ning lõpus oleku vahetamine:
- Paralleelne märgistamine: Peamine märgistamise osa toimub programmi tööga paralleelselt:
- Kustutamine: Pärast märgistamist peetakse kõiki valgeid objekte kättesaamatuks ja vabastatakse:
// Näide: kui objekt muutub kättesaamatuks
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Objekt loodud, kättesaadav
_ = d1 // Objekti kasutamine
d1 = nil // Objekt ei ole enam kättesaadav muutujast d1:
// Korjaja võib selle vabastada järgmisel tsüklil:
// Teised objektid, millele keegi ei viita, võivad samuti koguneda:
}
- Triggere: Korjaja käivitatakse, kui eraldatud mälu maht ületab teatud künnise, mis sõltub eelmisest eraldatud mälu mahust. Vaikimisi on see künnis kaks korda suurem eelmisest kasutatud mahust.
- Eesmärk: säilitada madal viivitus, vältides pikki "Lõpeta-Maailmas" pause:
// Korjaja käitumist saab kontrollida keskkonnamuutujate abil
// Näiteks seadistades GOGC=off, peatub prügikorjamine:
Üldiselt on Go prügikorjaja tõhus ja nõuab minimaalselt arendaja osalust.