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