Sobes.tech
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:

  1. Asistencia de marcado: Las goroutines del usuario ayudan al recolector en la fase de marcado durante la asignación de memoria.
  2. Marcado: Marcado paralelo de objetos alcanzables.
  3. Finalización del marcado: Una fase corta STW para finalizar el marcado.
  4. 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.