Middle+
Habla sobre el recolector de basura (garbage collector) en el lenguaje Go.
sobes.tech AI
Respuesta de la IA
Go utiliza un recolector de basura paralelo, de tres colores y no compactador con bajas latencias.
Principios básicos de funcionamiento:
- Marcado (Mark): Determina qué objetos son alcanzables desde los punteros raíz (registros, pilas de goroutines, variables globales). Se utiliza un algoritmo de tres colores (blanco - no visitado, gris - visitado, pero los descendientes aún no verificados, negro - visitado y todos los descendientes verificados).
- Barrido (Sweep): Elimina objetos inalcanzables (que permanecen blancos) y libera memoria para su reutilización.
Características:
- Paralelo: El marcado ocurre en paralelo con la ejecución del código del usuario (las fases STW - Stop-The-World - son muy cortas).
- Bajas latencias: Diseñado para minimizar las pausas en la ejecución de la aplicación.
- No compactador: No mueve objetos vivos en la memoria, lo que puede causar fragmentación, pero simplifica la implementación y acelera el marcado y barrido.
Fases de trabajo:
- Asistencia de marcado: Las goroutines del usuario ayudan al recolector en la fase de marcado durante la asignación de memoria.
- Marcado: Marcado paralelo de objetos alcanzables.
- Finalización del marcado: Una fase corta STW para finalizar el marcado.
- Barrido: Eliminación paralela de objetos inalcanzables.
Gestión:
- Automática.
- Los umbrales de activación del recolector de basura (GC trigger) se regulan mediante la variable de entorno
GOGC. Por defecto,GOGC=100, lo que significa que la recolección comenzará cuando el tamaño del montón se duplique respecto al ciclo de recolección anterior. - La función
runtime.GC()inicia forzosamente la recolección de basura, pero su uso no se recomienda en código estándar.
package main
import (
"runtime"
"time"
)
func main() {
// Ejemplo de llamada forzada a GC (poco frecuente)
runtime.GC()
// Ejemplo de obtención de estadísticas de GC
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Memoria total asignada: %v bytes\n", memStats.TotalAlloc)
}
Ventajas:
- Gestión automática de memoria, reduce la probabilidad de errores (fugas de memoria, liberaciones dobles).
- Diseñado para ejecución concurrente.
Desventajas:
- Tiempo de trabajo del GC no determinista.
- Posible aumento en el consumo de memoria en comparación con la gestión manual.