GC — sé el recolector de basura
Barre todos los objetos que las raíces ya no alcanzan antes de que se llene el montón. Liberar uno vivo es un segfault. Un juego sobre alcanzabilidad.
Eres el recolector de basura. Barre todo lo que las raíces ya no alcanzan.
Cómo jugar
- Los objetos naranjas son raíces —locales y globales—. Siempre están vivos.
- Un objeto está vivo si puedes llegar a él siguiendo referencias desde alguna raíz. Todo lo demás es basura.
- Pulsa la basura antes de que se acabe el tiempo. Si pulsas algo aún alcanzable, has liberado memoria viva: segfault, fin de la partida.
Cómo funciona
Los objetos aparecen en el montón con referencias entre ellos. Los naranjas son raíces —variables locales y globales— y todo lo que puedas alcanzar siguiendo referencias desde una raíz está vivo. El resto es basura y debes barrerla antes de que acabe el tiempo. Si pulsas un objeto vivo, has liberado memoria a la que algo aún apunta: segfault. Desde la ola 3 los objetos muertos se referencian entre sí en ciclos, justo el caso que un recolector por conteo de referencias no puede liberar y uno de trazado sí.
Un juego sobre la regla de alcanzabilidad que sustenta los recolectores de trazado. Los recolectores reales manejan además generaciones, barreras de escritura y concurrencia.
Preguntas frecuentes
¿Cómo decide el juego qué es basura?
Por alcanzabilidad, calculada en vivo: recorre las referencias desde cada raíz y marca lo que encuentra. Lo no marcado es basura. Es exactamente la fase de marcado de mark-and-sweep.
¿Por qué se apuntan entre sí los objetos muertos?
Desde la ola 3 la basura se enlaza en ciclos a propósito. Un recolector por conteo de referencias nunca puede liberarlos, porque cada objeto conserva una referencia entrante; uno de trazado simplemente nunca llega a ellos.
¿Por qué es fatal pulsar un objeto vivo?
Porque liberar memoria a la que algo todavía apunta es un use-after-free, la causa de buena parte de los fallos y exploits reales. El juego es tan implacable con eso como tu asignador de memoria.