Internals del recolector de basura
Marcado y barrido tricolor, GOGC y pausas del GC
Internals del recolector de basura es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
Marcado y barrido tricolor
El GC de Go utiliza un algoritmo concurrente de marcado y barrido tricolor. Los objetos son blancos (no visitados), grises (encontrados, pero con sus hijos sin explorar) o negros (completamente explorados). Los objetos blancos son basura durante el barrido.
GC concurrente
El GC de Go se ejecuta principalmente de forma concurrente con las goroutines de la aplicación. Esto reduce las pausas de stop-the-world (STW) a duraciones inferiores a un milisegundo en la mayoría de los programas.
Barrera de escritura
Una barrera de escritura intercepta las escrituras de punteros durante la fase de marcado concurrente para mantener la invariante de que los objetos negros no apunten a objetos blancos. Añade una pequeña sobrecarga a cada escritura de puntero.
Fases STW
Dos pausas breves de STW por ciclo del GC: (1) configuración del marcado (habilitar la barrera de escritura y tomar una instantánea de las pilas de las goroutines), (2) finalización del marcado (asegurarse de que todos los objetos grises se hayan explorado). El P99 suele ser <1ms.
GOGC
El activador del GC se controla mediante GOGC (valor predeterminado: 100). Esto significa "ejecutar el GC cuando el tamaño del heap activo se duplique con respecto al GC anterior". Establecer GOGC=50 activa el GC con más frecuencia y utiliza menos memoria; GOGC=200 lo activa con menos frecuencia y utiliza más memoria.
GOMEMLIMIT
GOMEMLIMIT (Go 1.19+) establece un límite flexible de memoria. Cuando el heap se acerca al límite, el GC se ejecuta de forma más agresiva, independientemente de GOGC. Úselo para evitar terminaciones por falta de memoria (OOM) en entornos con memoria limitada.
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)Ritmo de trabajo
El GC ajusta su ritmo para terminar el marcado antes de que el heap se llene en relación con GOGC. Si la tasa de asignación es alta, aumenta el número de gorutinas que colaboran en el marcado (mark assists).
runtime.GC()
La llamada a runtime.GC() fuerza un ciclo inmediato del GC. Resulta útil en pruebas para garantizar que se ejecuten los finalizadores, o en benchmarks para comenzar con un heap limpio. No la llame en producción.
Finalizadores
Registre una función para que se ejecute cuando un objeto sea recolectado por el GC mediante runtime.SetFinalizer. Los finalizadores se ejecutan en una gorutina dedicada después del GC. Evítelos para liberar recursos; use métodos Close() en su lugar.
Métricas del GC
Lea las estadísticas del GC con runtime.ReadMemStats o expóngalas mediante métricas de Prometheus. Campos clave: 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
Un proceso de recuperación en segundo plano devuelve al sistema operativo la memoria inactiva del heap. Se ejecuta de forma concurrente y ajusta su ritmo para no afectar al rendimiento de las operaciones en primer plano. Se utiliza la llamada al sistema MADV_FREE o MADV_DONTNEED.
Comprobación rápida
¿Qué hace GOMEMLIMIT en Go 1.19 o posterior?
Repaso: funcionamiento interno del GC
Puntos clave:
- Marcado y barrido tricolor concurrente, con dos pausas breves de STW
- GOGC controla la proporción de crecimiento del heap; el valor predeterminado es 100 (un crecimiento del 100 % activa el GC)
- GOMEMLIMIT proporciona seguridad frente al límite de memoria de los contenedores (Go 1.19+)
- runtime.ReadMemStats proporciona métricas del GC
Preguntas frecuentes
¿La lección «Internals del recolector de basura» es gratis?
Sí — el texto completo de «Internals del recolector de basura» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Internals del recolector de basura»?
Marcado y barrido tricolor, GOGC y pausas del GC Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Internals del recolector de basura»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Stack frente a heap y análisis de escape
- Modelo de memoria de Go y Happens-Before
- Internals del recolector de basura
- Reducción de asignaciones: sync.Pool y arenas