Interni del garbage collector
Mark-sweep a tre colori, GOGC e pause del GC
Interni del garbage collector è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Mark-and-sweep a tre colori
Il GC di Go utilizza un algoritmo mark-and-sweep concorrente a tre colori. Gli oggetti sono bianchi (non visitati), grigi (individuati, ma con i figli non ancora analizzati) o neri (completamente analizzati). Gli oggetti bianchi sono spazzatura durante la fase di sweep.
GC concorrente
Il GC di Go viene eseguito per lo più in concorrenza con le goroutine dell'applicazione. Questo riduce le pause stop-the-world (STW) a durate inferiori al millisecondo nella maggior parte dei programmi.
Write barrier
Una write barrier intercetta le scritture di puntatori durante la fase di mark concorrente per mantenere l'invariante secondo cui gli oggetti neri non puntano a oggetti bianchi. Aggiunge un piccolo sovraccarico a ogni scrittura di puntatore.
Fasi STW
Due brevi pause STW per ogni ciclo del GC: (1) preparazione del mark (abilitazione della write barrier, acquisizione dello snapshot degli stack delle goroutine), (2) terminazione del mark (verifica che tutti gli oggetti grigi siano stati analizzati). Il valore P99 è in genere <1ms.
GOGC
Il trigger del GC è controllato da GOGC (valore predefinito 100). Significa «esegui il GC quando la dimensione dell'heap attivo raddoppia rispetto al GC precedente». Impostando GOGC=50 si esegue il GC più frequentemente usando meno memoria; con GOGC=200 lo si esegue meno frequentemente usando più memoria.
GOMEMLIMIT
GOMEMLIMIT (Go 1.19+) imposta un limite di memoria morbido. Quando l'heap si avvicina al limite, il GC viene eseguito più aggressivamente, indipendentemente da GOGC. Lo utilizzi per evitare terminazioni per OOM in ambienti con memoria limitata.
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)Regolazione del ritmo
Il GC regola il proprio ritmo per completare la marcatura prima che l'heap si riempia in rapporto a GOGC. Se la velocità di allocazione è elevata, aumenta il numero di goroutine che collaborano alla marcatura (mark assists).
runtime.GC()
La chiamata a runtime.GC() forza un ciclo immediato del GC. È utile nei test per assicurarsi che vengano eseguiti i finalizer o nei benchmark per iniziare con un heap pulito. Non la chiami in produzione.
Finalizer
Registri una funzione da eseguire quando un oggetto viene raccolto dal garbage collector con runtime.SetFinalizer. I finalizer vengono eseguiti in una goroutine dedicata dopo il GC. Li eviti per la pulizia delle risorse: utilizzi invece i metodi Close().
Metriche del GC
Legga le statistiche del GC da runtime.ReadMemStats oppure le esponga tramite metriche Prometheus. Campi principali: NumGC, PauseNs, HeapAlloc, HeapInuse.
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])Scavenger
Uno scavenger in background restituisce al sistema operativo la memoria inattiva dell'heap. Viene eseguito in concorrenza e regola il proprio ritmo per non influire sulle prestazioni in primo piano. Viene utilizzata la chiamata di sistema MADV_FREE o MADV_DONTNEED.
Verifica rapida
Che cosa fa GOMEMLIMIT in Go 1.19+?
Riepilogo: internals del GC
Punti chiave:
- Mark-and-sweep tri-colore concorrente; due brevi pause STW
- GOGC controlla il rapporto di crescita dell'heap; valore predefinito 100 (una crescita del 100% attiva il GC)
- GOMEMLIMIT garantisce la sicurezza della memoria nei container (Go 1.19+)
- runtime.ReadMemStats fornisce le metriche del GC
Domande Frequenti
La lezione «Interni del garbage collector» è gratuita?
Sì — il testo completo di «Interni del garbage collector» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «Interni del garbage collector»?
Mark-sweep a tre colori, GOGC e pause del GC Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Interni del garbage collector»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Stack, heap ed escape analysis
- Modello di memoria di Go e happens-before
- Interni del garbage collector
- Ridurre le allocazioni: sync.Pool e arena