0Pricing
Go Academy · Lección

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

  1. Stack frente a heap y análisis de escape
  2. Modelo de memoria de Go y Happens-Before
  3. Internals del recolector de basura
  4. Reducción de asignaciones: sync.Pool y arenas
← Volver a Go Academy