Middle
Millised on teie teadmised Go keele prügikoristajast?
sobes.tech AI
Vastus AI-lt
Golang kasutab paralleelset ja madala latentsusega prügikoristajat, mis põhineb mark-sweep algoritmil.
Peamised omadused:
- Kolmevärviline algoritm (Three-color algorithm): Märgib objekte kolme värviga: valge (potentsiaalne prügi), hall (objekt on kättesaadav, kuid selle järeltulijad pole kontrollitud) ja must (objekt ja selle järeltulijad on kättesaadavad).
- Paralleelsus (Parallel): töötab paralleelselt kasutaja gorutinatega mitmel tuumal, minimeerides peatusaja.
- Konkurentsus (Concurrent): Enamik GC tööst toimub samaaegselt programmi täitmisega.
- Madala latentsusega peatusaeg (Low-latency Stop-The-World): Kõigi gorutinite peatusaeg on äärmiselt lühike, kasutatakse ainult faasides "märgistamise algus" (start of marking) ja "märgistamise lõpp" (end of marking), et tagada objektide graafi järjepidevus.
- Korduvkasutatavad skaneeringud (Stack scanning): Skaneerimine toimub ka paralleelselt ja konkurentsivõimeliselt STW-ga.
- Hüpi kasvutase (Heap growth target): GC püüab hoida teatud protsendi täituvusest pärast iga tsüklit, vältides liiga sagedasi või liiga harva tsükleid. Seda piiri saab kontrollida muutuja
GOGCkaudu. Vaikimisi väärtus onGOGC=100, mis tähendab, et GC käivitatakse, kui hüpi suurus kahekordistub.
GC töötsükkel koosneb järgmistest faasidest:
- GCstart: Lühike STW faas. Määrab märgistamiseks juurobjektid.
- GCmark: Konkurentsivõimeline faas. GC läbib objekti graafi ja märgib kättesaadavad objektid (hall -> must). Kasutab write barrier'i muutuste jälgimiseks märgistamise ajal.
- GCmarktermination: Lühike STW faas. Lõpetab märgistamise ja liigub sweep'ile.
- GCsweep: Konkurentsivõimeline faas. Kättesaamatud (valged) objektid vabastatakse. Seda faasi võib toimuda taustal või vajadusel uue mälu eraldamisel.
GC Go-s juhitakse automaatselt ning enamikul juhtudel ei nõua käsitsi kutsumist. GC jõudlust saab jälgida keskkonnamuutujate GODEBUG=gctrace=1 abil.
Näide jälgimiseks:
$ GODEBUG=gctrace=1 go run your_program.go
gctrace väljund näitab teavet iga GC tsükli kohta, sh faaside ajad, hüpi suurus ja STW aeg.
GC optimeerimiseks, lisaks GOGC seadistamisele, võib kaaluda:
- Alokatsioonide arvu vähendamist (näiteks taaskasutades buferid, vältides tarbetuid teisendusi).
- "Escape analysis" profiili kasutamist, et mõista, millised objektid on hüpisse alustatud.
sync.Poolkasutamist sageli loodavate ja vabastatavate objektide jaoks.