Sobes.tech
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:

  1. 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).
  2. Paralleelsus (Parallel): töötab paralleelselt kasutaja gorutinatega mitmel tuumal, minimeerides peatusaja.
  3. Konkurentsus (Concurrent): Enamik GC tööst toimub samaaegselt programmi täitmisega.
  4. 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.
  5. Korduvkasutatavad skaneeringud (Stack scanning): Skaneerimine toimub ka paralleelselt ja konkurentsivõimeliselt STW-ga.
  6. 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 GOGC kaudu. Vaikimisi väärtus on GOGC=100, mis tähendab, et GC käivitatakse, kui hüpi suurus kahekordistub.

GC töötsükkel koosneb järgmistest faasidest:

  1. GCstart: Lühike STW faas. Määrab märgistamiseks juurobjektid.
  2. 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.
  3. GCmarktermination: Lühike STW faas. Lõpetab märgistamise ja liigub sweep'ile.
  4. 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.Pool kasutamist sageli loodavate ja vabastatavate objektide jaoks.