Sobes.tech
Middle+

Vorbește despre colectorul de gunoi (garbage collector) în limbajul Go.

sobes.tech AI

Răspuns de la AI

Go utilizează un colector de gunoi paralel, cu trei culori, necompactant și cu latențe scăzute.

Principiile de bază ale funcționării:

  • Marcarea (Mark): Determină ce obiecte sunt accesibile din pointerii rădăcină (registre, stive de goroutine, variabile globale). Utilizează un algoritm cu trei culori (alb - nevizitat, gri - vizitat, dar descendenții încă neverificați, negru - vizitat și toți descendenții verificați).
  • Curățarea (Sweep): Elimină obiectele inaccesibile (rămân albe) și eliberează memoria pentru reutilizare.

Caracteristici:

  • Paralel: Marcarea are loc în paralel cu execuția codului utilizatorului (fazele STW - Stop-The-World - sunt foarte scurte).
  • Latențe scăzute: Proiectat pentru a minimiza pauzele în funcționarea aplicației.
  • Necompactant: Nu mută obiectele vii în memorie, ceea ce poate duce la fragmentare, dar simplifică implementarea și accelerează marcarea/curățarea.

Fazele de lucru:

  1. Asistență la marcaj: Goroutine-urile utilizatorului ajută colectorul în faza de marcaj în timpul alocării memoriei.
  2. Marcaj: Marcarea paralelă a obiectelor accesibile.
  3. Finalizarea marcajului: O fază scurtă STW pentru finalizarea marcajului.
  4. Curățare: Eliminarea paralelă a obiectelor inaccesibile.

Gestionare:

  • Automat.
  • Pragurile de declanșare a GC (garbage collection) sunt reglate de variabila de mediu GOGC. În mod implicit, GOGC=100, ceea ce înseamnă că colectarea va începe atunci când dimensiunea heap-ului se dublează față de ciclul anterior.
  • Funcția runtime.GC() inițiază forțat colectarea de gunoi, dar utilizarea sa nu este recomandată în codul standard.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Exemplu de apel forțat GC (rar)
	runtime.GC()

	// Exemplu de citire a statisticilor GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Memorie total alocată: %v bytes\n", memStats.TotalAlloc)
}

Avantaje:

  • Gestionare automată a memoriei, reduce probabilitatea de erori (scurgeri de memorie, eliberări duble).
  • Proiectat pentru execuție concurentă.

Dezavantaje:

  • Timpul de lucru al GC nu este determinist.
  • Posibilă creștere a consumului de memorie comparativ cu gestionarea manuală.