0Pricing
Go Academy · Lezione

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

  1. Stack, heap ed escape analysis
  2. Modello di memoria di Go e happens-before
  3. Interni del garbage collector
  4. Ridurre le allocazioni: sync.Pool e arena
← Torna a Go Academy