Sobes.tech
Middle+

Kuidas töötab prügikorjaja Go keeles?

sobes.tech AI

Vastus AI-lt

Go prügikoristaja rakendab paralleelset, ebatäpset (non-generational) meetodit, mis põhineb Mark-and-Sweep algoritmil ja mille käivitab mälu maht.

Peamised tööpõhimõtted:

  1. Käivitustrigger: Prügikoristaja käivitub, kui eraldatud mälu maht ületab teatud künnise. Seda künnist reguleeritakse dünaamiliselt.
  2. Märgistusfaas (Mark Phase):
    • Prügikoristaja peatab ainult Märgistamisfaasi kriitilise osa (Stop-the-World, STW), kuid see kestab väga lühikest aega.
    • Paralleelselt töötava programmiga (mutator) läbib ta objektide graafi, mis põhineb juurindikaatoritel (registreid, globaalseid muutujaid, gorutinite stakke).
    • Elusad (saadaval olevad) objektid märgitakse kasutatavateks.
  3. Puhastamisfaas (Sweep Phase):
    • Pärast Märgistamisfaasi lõppu läbib ta rentimise järjesta (spans).
    • Märgistamata objektid peetakse prügi ja nende mälu vabastatakse.
    • Seda faasi teostatakse ka paralleelselt programmi tööga.
  4. Write Barrier: Go kasutab write barrierit, et jälgida muutusi objektide graafis paralleelse märgistamise ajal. See tagab korrektselt töötava kogumiku, vaatamata mutator'i mälumuutustele.
  5. Põlvkonnad puuduvad: Erinevalt mõnest teisest keelest, Go ei jaota objekte põlvkondadesse. Prügikoristaja töötleb kogu kogumit täielikult.
  6. Madala viivituse eesmärk: Go GC projekteerimisel seatakse eesmärgiks minimeerida viivitusi, mis on seotud prügikoristusega (STW pausid), muutes selle sobivaks serverirakendustele.

Paralleelsus ja write barrier võimaldavad kogumikul minimeerida programmi peatamise aega, tagades kõrge jõudluse.

Näide lihtsustatud mälu haldamisest (mitte otsene GC, kuid illustreerib ressursside vabastamist):

package main

import (
	"fmt"
	"os"
)

func main() {
	// Näide ajutise ressursi loomise kohta, mis hiljem vabastatakse
	file, err := os.Create("temp.txt")
	if err != nil {
		fmt.Println("Viga faili loomisel:", err)
		return
	}
	// Faili sulgemine defferiga.
	// Kuigi see ei ole otsene GC, see näitab ressursside vabastamist.
	defer file.Close()

	fmt.Println("Fail 'temp.txt' loodud.")

	// Edasi saab programm töötada failiga...

	// GC töötab automaatselt taustal, kogudes kasutamata objekte:
	// Näiteks, kui loome järjendi või kaardi:
	data := make([]int, 1000000) // Eraldamine mälu
	_ = data // Kasutamine

	// Kui data muutub kättesaamatuks (näiteks funktsioonist väljumisel),
	// kogumik vabastab aja jooksul eraldatud mälu.
}