GC — sii il garbage collector
Spazza via tutti gli oggetti che le radici non raggiungono più prima che l’heap si riempia. Liberarne uno vivo è un segfault. Un gioco sulla raggiungibilità.
Sei il garbage collector. Rimuovi tutto ciò che le radici non raggiungono più.
Come si gioca
- Gli oggetti arancioni sono radici — variabili locali e globali. Sono sempre vivi.
- Un oggetto è vivo se puoi raggiungerlo seguendo i riferimenti da una radice. Tutto il resto è spazzatura.
- Clicca la spazzatura prima che scada il tempo. Se clicchi qualcosa ancora raggiungibile hai liberato memoria viva — segfault, partita finita.
Come funziona
Gli oggetti compaiono nell’heap con riferimenti tra loro. Quelli arancioni sono radici — variabili locali e globali — e tutto ciò che raggiungi seguendo i riferimenti da una radice è vivo. Il resto è spazzatura, da rimuovere prima che scada il tempo. Se clicchi un oggetto vivo hai liberato memoria ancora referenziata: segfault. Dall’ondata 3 gli oggetti morti si referenziano a vicenda in cicli, esattamente il caso che un collettore a conteggio di riferimenti non può liberare e uno tracciante sì.
Un gioco sulla regola di raggiungibilità al cuore dei collettori traccianti. I collettori reali gestiscono anche generazioni, write barrier e concorrenza.
Domande frequenti
Come decide il gioco cosa è spazzatura?
Per raggiungibilità, calcolata dal vivo: segue i riferimenti da ogni radice e marca ciò che trova. Ciò che non è marcato è spazzatura. È esattamente la fase di marcatura di mark-and-sweep.
Perché gli oggetti morti si puntano a vicenda?
Dall’ondata 3 la spazzatura viene collegata in cicli di proposito. Un collettore a conteggio di riferimenti non può mai liberarli, perché ogni oggetto conserva un riferimento entrante; uno tracciante semplicemente non li raggiunge mai.
Perché cliccare un oggetto vivo è fatale?
Perché liberare memoria ancora referenziata è un use-after-free, all’origine di gran parte dei crash e degli exploit reali. Il gioco è severo quanto il tuo allocatore.