Gesti贸n del recolector de basura:
Hay un par谩metro que permite administrar el recolector de basura en Go: "GOGC"
La variable de entorno GOGC o su equivalente funcional, SetGCPercent , del paquete runtime/debug .
El par谩metro de GOGC determina el porcentaje de memoria del Heap nueva no asignada en relaci贸n con la memoria activa en la que se activar谩 la recolecci贸n de basura.
El valor predeterminado de GOGC es 100, lo que significa que la recolecci贸n de basura se activar谩 cuando la cantidad de memoria nueva alcance el 100% de memoria del Heap activo.
El recolector de basura se ejecutar铆a cuando el nuevo Heap ocupara el 100% del Heap activo. Esto se muestra en la siguiente imagen:
- Ejemplo usando la versi贸n 1.20.X de Go.
En el siguiente ejemplo la funci贸n performMemoryIntensiveTask utiliza una gran cantidad de memoria asignada en el Heap. Esta funci贸n lanza un grupo de trabajadores con un tama帽o de cola de NumWorker y el n煤mero de tareas igual a NumTasks.
Ahora tomando un programa de ejemplo rastreemos los cambios en el tama帽o del Heap usando la herramienta go trace.
|
package main import ( "fmt" "os" "runtime/debug" "runtime/trace" "sync" ) const ( NumWorkers 聽聽聽= 4 聽聽聽聽// Num. workers NumTasks 聽聽聽聽聽= 500 聽聽// Num. tasks MemoryIntense = 10000 // Size of memory-intensive task (num. elements). ) func main() { // Write to the trace file. f, _ := os.Create("trace.out") trace.Start(f) defer trace.Stop() // Set the target percentage for the garbage collector. Default is 100%. debug.SetGCPercent(100) // Task queue and result queue. taskQueue := make(chan int, NumTasks) resultQueue := make(chan int, NumTasks) // Start workers. var wg sync.WaitGroup wg.Add(NumWorkers) for i := 0; i < NumWorkers; i++ { go worker(taskQueue, resultQueue, &wg) } // Send tasks to the queue. for i := 0; i < NumTasks; i++ { taskQueue <- i } close(taskQueue) // Retrieve results from the queue. go func() { wg.Wait() close(resultQueue) }() // Process the results. for result := range resultQueue { fmt.Println("Result:", result) } fmt.Println("Done!") } // Worker function. func worker(tasks <-chan int, results chan<- int, wg *sync.WaitGroup) { defer wg.Done() for task := range tasks { result := performMemoryIntensiveTask(task) results <- result 聽} } // performMemoryIntensiveTask is a memory-intensive function. func performMemoryIntensiveTask(task int) int { data := make([]int, MemoryIntense) for i := 0; i < MemoryIntense; i++ { data[i] = i + task } time.Sleep(10 * time.Millisecond) // Calculate the result. result := 0 for _, value := range data { result += value } return result } |
Salida
|
f, _ := os.Create("trace.out") trace.Start(f) defer trace.Stop() |
Al utilizar la herramienta de seguimiento de Go (go tool trace), se puede observar cambios en el tama帽o del Heap y analizar el comportamiento del recolector de basura en el programa.