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:
- Asistență la marcaj: Goroutine-urile utilizatorului ajută colectorul în faza de marcaj în timpul alocării memoriei.
- Marcaj: Marcarea paralelă a obiectelor accesibile.
- Finalizarea marcajului: O fază scurtă STW pentru finalizarea marcajului.
- 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ă.