Sobes.tech
Middle+

Parla del garbage collector nel linguaggio Go.

sobes.tech AI

Risposta dell'AI

Go utilizza un raccoglitore di garbage parallelo, a tre colori e non compatto, con basse latenze.

Principi di funzionamento principali:

  • Marcatura (Mark): Determina quali oggetti sono raggiungibili dai puntatori radice (registri, stack delle goroutine, variabili globali). Utilizza un algoritmo a tre colori (bianco - non visitato, grigio - visitato, ma i discendenti non ancora verificati, nero - visitato e tutti i discendenti verificati).
  • Pulizia (Sweep): Rimuove gli oggetti inaccessibili (rimangono bianchi) e libera memoria per il riutilizzo.

Caratteristiche:

  • Parallelo: La marcatura avviene in parallelo con l'esecuzione del codice utente (le fasi STW - Stop-The-World - sono molto brevi).
  • Basse latenze: Progettato per minimizzare le pause nell'esecuzione dell'applicazione.
  • Non compatto: Non sposta gli oggetti vivi in memoria, il che può portare a frammentazione, ma semplifica l'implementazione e accelera la marcatura/pulizia.

Fasi di lavoro:

  1. Assistenza alla marcatura: Le goroutine utente aiutano il raccoglitore nella fase di marcatura durante l'allocazione della memoria.
  2. Marcatura: Marcatura parallela degli oggetti raggiungibili.
  3. Terminazione della marcatura: Una breve fase STW per finalizzare la marcatura.
  4. Pulizia: Rimozione parallela degli oggetti inaccessibili.

Gestione:

  • Automatica.
  • Le soglie di trigger del garbage collector (GC trigger) sono regolate dalla variabile di ambiente GOGC. Per impostazione predefinita, GOGC=100, il che significa che la raccolta inizierà quando la dimensione dell'heap raddoppierà rispetto al ciclo precedente.
  • La funzione runtime.GC() avvia forzatamente la raccolta, ma il suo uso non è raccomandato nel codice standard.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Esempio di chiamata forzata a GC (raro)
	runtime.GC()

	// Esempio di lettura delle statistiche GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Memoria totale allocata: %v bytes\n", memStats.TotalAlloc)
}

Vantaggi:

  • Gestione automatica della memoria, riduce la probabilità di errori (fughe di memoria, doppie liberazioni).
  • Progettato per l'esecuzione concorrente.

Svantaggi:

  • Tempo di lavoro del GC non deterministico.
  • Potenziale aumento del consumo di memoria rispetto alla gestione manuale.