Sobes.tech
Middle+

Räägi Go keele prügikoristusest (garbage collector).

sobes.tech AI

Vastus AI-lt

Go kasutab paralleelset, kolmetvärvilist, mittekompaktset prügikoristust, mille latents on madal.

Peamised tööpõhimõtted:

  • Märkimine (Mark): Määrab, millised objektid on kättesaadavad juurteviitidest (registreerid, gorutinite vardad, globaalsed muutujad). Kasutatakse kolmetvärvilist algoritmi (valge - külastamata, hall - külastatud, kuid veel mitte kontrollitud, must - külastatud ja kõik järeltulijad kontrollitud).
  • Koristus (Sweep): Eemaldab kättesaamatud objektid (jäävad valgeks) ja vabastab mälu korduvkasutuseks.

Eraldused:

  • Paralleelne: Märkimine toimub paralleelselt kasutaja koodi täitmisega (STW - Stop-The-World faasid on väga lühikesed).
  • Madal latentsus: Disainitud minimeerima pauside aega rakenduse töös.
  • Mittekompaktne: Ei liigu elavaid objekte mälus, mis võib põhjustada fragmentatsiooni, kuid lihtsustab teostust ja kiirendab märkimist/koristust.

Tööfaasid:

  1. Mark abiline: Kasutaja gorutiinid aitavad kogujal märkimisfaasis mälu eraldamisel.
  2. Märkimine: Paralleelne kättesaadavate objektide märkimine.
  3. Märkimise lõpetamine: Lühike STW faas märkimise finaliseerimiseks.
  4. Koristus: Paralleelne kättesaamatute objektide eemaldamine.

Juhtimine:

  • Automaatne.
  • Prügikoristuse läveseadised (GC trigger) on reguleeritavad keskkonnamuutuja GOGC abil. Vaikimisi väärtus on GOGC=100, mis tähendab, et kogumine algab, kui kogumiku suurus kahekordistub võrreldes eelneva tsükliga.
  • Funktsioon runtime.GC() käivitab sunniviisiliselt prügikoristuse, kuid selle kasutamist ei soovitata standardkoodis.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Näide sunniviisilisest GC kutsest
	runtime.GC()

	// Näide GC statistika saamisest
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Kokku eraldatud mälu: %v baiti\n", memStats.TotalAlloc)
}

Eelised:

  • Automaatne mälu haldus, vähendab vigade tõenäosust (mälulõhkumine, topeltvabastamine).
  • Disainitud konkurentsivõimelisele täitmisele.

Miinused:

  • Ebaselge tööaeg GC.
  • Võimalik mälu kasutuse suurenemine võrreldes käsitsi juhtimisega.