馃敊 Regresar

Gesti贸n del recolector de basura:

Hay un par谩metro que permite administrar el recolector de basura en Go: "GOGC"

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.