Middle+
Parla del garbage collector nel linguaggio Go.
sobes.tech AI
Risposta dell'AI
Go utilizza un raccoglitore di garbage parallelo, a tre colori e non compatto, con basse latenze.
Principi di funzionamento principali:
- Marcatura (Mark): Determina quali oggetti sono raggiungibili dai puntatori radice (registri, stack delle goroutine, variabili globali). Utilizza un algoritmo a tre colori (bianco - non visitato, grigio - visitato, ma i discendenti non ancora verificati, nero - visitato e tutti i discendenti verificati).
- Pulizia (Sweep): Rimuove gli oggetti inaccessibili (rimangono bianchi) e libera memoria per il riutilizzo.
Caratteristiche:
- Parallelo: La marcatura avviene in parallelo con l'esecuzione del codice utente (le fasi STW - Stop-The-World - sono molto brevi).
- Basse latenze: Progettato per minimizzare le pause nell'esecuzione dell'applicazione.
- Non compatto: Non sposta gli oggetti vivi in memoria, il che può portare a frammentazione, ma semplifica l'implementazione e accelera la marcatura/pulizia.
Fasi di lavoro:
- Assistenza alla marcatura: Le goroutine utente aiutano il raccoglitore nella fase di marcatura durante l'allocazione della memoria.
- Marcatura: Marcatura parallela degli oggetti raggiungibili.
- Terminazione della marcatura: Una breve fase STW per finalizzare la marcatura.
- Pulizia: Rimozione parallela degli oggetti inaccessibili.
Gestione:
- Automatica.
- Le soglie di trigger del garbage collector (GC trigger) sono regolate dalla variabile di ambiente
GOGC. Per impostazione predefinita,GOGC=100, il che significa che la raccolta inizierà quando la dimensione dell'heap raddoppierà rispetto al ciclo precedente. - La funzione
runtime.GC()avvia forzatamente la raccolta, ma il suo uso non è raccomandato nel codice standard.
package main
import (
"runtime"
"time"
)
func main() {
// Esempio di chiamata forzata a GC (raro)
runtime.GC()
// Esempio di lettura delle statistiche GC
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Memoria totale allocata: %v bytes\n", memStats.TotalAlloc)
}
Vantaggi:
- Gestione automatica della memoria, riduce la probabilità di errori (fughe di memoria, doppie liberazioni).
- Progettato per l'esecuzione concorrente.
Svantaggi:
- Tempo di lavoro del GC non deterministico.
- Potenziale aumento del consumo di memoria rispetto alla gestione manuale.