GOLANG_INTERVIEW Telegram 267
Как управлять сборщиком мусора в GO? Приведите пример с кодом.

Существует параметр, который позволяет управлять сборщиком мусора в Go - это переменная окружения GOGC или ее функциональный аналог SetGCPercent из пакета runwww.tgoop.com/debug.

Параметр GOGC определяет процент новой необработанной памяти кучи от живой памяти, при достижении которого будет запущена сборка мусора. Значение GOGC по умолчанию равно 100, что означает, что сборка мусора будет запущена, когда объем новой памяти достигнет 100% от объема живой памяти

Рассмотрим пример программы и отследим изменение размера кучи с помощью инструмента go tool trace. Для запуска программы используем версию Go 1.20.1.

В данном примере, функция performMemoryIntensiveTask использует большое количество памяти размещаемой в куче. Данная функция запускает обработчик с размером очереди NumWorker и количество задач равное NumTasks.

package main

import (
"fmt"
"os"
"runwww.tgoop.com/debug"
"runwww.tgoop.com/trace"
"sync"
"time"
)

const (
NumWorkers = 4 // Количество воркеров.
NumTasks = 500 // Количество задач.
MemoryIntense = 10000 // Размер память затратной задачи (число элементов).
)

func main() {
// Запись в trace файл.
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()

// Установка целевого процента сборщика мусора. По умолчанию 100%.
debug.SetGCPercent(100)

// Очередь задач и очередь результата.
taskQueue := make(chan int, NumTasks)
resultQueue := make(chan int, NumTasks)

// Запуск воркеров.
var wg sync.WaitGroup
wg.Add(NumWorkers)
for i := 0; i < NumWorkers; i++ {
go worker(taskQueue, resultQueue, &wg)
}

// Отправка задач в очередь.
for i := 0; i < NumTasks; i++ {
taskQueue <- i
}
close(taskQueue)

// Получение результатов из очереди.
go func() {
wg.Wait()
close(resultQueue)
}()

// Обработка результатов.
for result := range resultQueue {
fmt.Println("Результат:", result)
}

fmt.Println("Готово!")
}

// Функция воркера.
func worker(tasks <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()

for task := range tasks {
result := performMemoryIntensiveTask(task)
results <- result
}
}

// performMemoryIntensiveTask функция требующая много памяти.
func performMemoryIntensiveTask(task int) int {
// Создание среза большого размера.
data := make([]int, MemoryIntense)
for i := 0; i < MemoryIntense; i++ {
data[i] = i + task
}

// Имитация временной задержки
time.Sleep(10 * time.Millisecond)

// Вычисление результата.
result := 0
for _, value := range data {
result += value
}
return result
}

Для трассировки работы программы результат записывается в файл trace.out:

// Запись в trace файл.
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()

Используя инструмент go tool trace, мы можем наблюдать за изменениями размера кучи и анализировать поведение сборщика мусора в вашей программе.

Hidden text
Обратите внимание, что точные детали и возможности инструмента go tool trace могут варьироваться в разных версиях Go, поэтому рекомендуется обратиться к официальной документации для получения более подробной информации о его использовании в вашей конкретной версии Go.

 Статья

@golang_interview
🔥9👍64👎3



tgoop.com/golang_interview/267
Create:
Last Update:

Как управлять сборщиком мусора в GO? Приведите пример с кодом.

Существует параметр, который позволяет управлять сборщиком мусора в Go - это переменная окружения GOGC или ее функциональный аналог SetGCPercent из пакета runwww.tgoop.com/debug.

Параметр GOGC определяет процент новой необработанной памяти кучи от живой памяти, при достижении которого будет запущена сборка мусора. Значение GOGC по умолчанию равно 100, что означает, что сборка мусора будет запущена, когда объем новой памяти достигнет 100% от объема живой памяти

Рассмотрим пример программы и отследим изменение размера кучи с помощью инструмента go tool trace. Для запуска программы используем версию Go 1.20.1.

В данном примере, функция performMemoryIntensiveTask использует большое количество памяти размещаемой в куче. Данная функция запускает обработчик с размером очереди NumWorker и количество задач равное NumTasks.

package main

import (
"fmt"
"os"
"runwww.tgoop.com/debug"
"runwww.tgoop.com/trace"
"sync"
"time"
)

const (
NumWorkers = 4 // Количество воркеров.
NumTasks = 500 // Количество задач.
MemoryIntense = 10000 // Размер память затратной задачи (число элементов).
)

func main() {
// Запись в trace файл.
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()

// Установка целевого процента сборщика мусора. По умолчанию 100%.
debug.SetGCPercent(100)

// Очередь задач и очередь результата.
taskQueue := make(chan int, NumTasks)
resultQueue := make(chan int, NumTasks)

// Запуск воркеров.
var wg sync.WaitGroup
wg.Add(NumWorkers)
for i := 0; i < NumWorkers; i++ {
go worker(taskQueue, resultQueue, &wg)
}

// Отправка задач в очередь.
for i := 0; i < NumTasks; i++ {
taskQueue <- i
}
close(taskQueue)

// Получение результатов из очереди.
go func() {
wg.Wait()
close(resultQueue)
}()

// Обработка результатов.
for result := range resultQueue {
fmt.Println("Результат:", result)
}

fmt.Println("Готово!")
}

// Функция воркера.
func worker(tasks <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()

for task := range tasks {
result := performMemoryIntensiveTask(task)
results <- result
}
}

// performMemoryIntensiveTask функция требующая много памяти.
func performMemoryIntensiveTask(task int) int {
// Создание среза большого размера.
data := make([]int, MemoryIntense)
for i := 0; i < MemoryIntense; i++ {
data[i] = i + task
}

// Имитация временной задержки
time.Sleep(10 * time.Millisecond)

// Вычисление результата.
result := 0
for _, value := range data {
result += value
}
return result
}

Для трассировки работы программы результат записывается в файл trace.out:

// Запись в trace файл.
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()

Используя инструмент go tool trace, мы можем наблюдать за изменениями размера кучи и анализировать поведение сборщика мусора в вашей программе.

Hidden text
Обратите внимание, что точные детали и возможности инструмента go tool trace могут варьироваться в разных версиях Go, поэтому рекомендуется обратиться к официальной документации для получения более подробной информации о его использовании в вашей конкретной версии Go.

 Статья

@golang_interview

BY Golang вопросы собеседований


Share with your friend now:
tgoop.com/golang_interview/267

View MORE
Open in Telegram


Telegram News

Date: |

fire bomb molotov November 18 Dylan Hollingsworth yau ma tei Joined by Telegram's representative in Brazil, Alan Campos, Perekopsky noted the platform was unable to cater to some of the TSE requests due to the company's operational setup. But Perekopsky added that these requests could be studied for future implementation. The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. best-secure-messaging-apps-shutterstock-1892950018.jpg Those being doxxed include outgoing Chief Executive Carrie Lam Cheng Yuet-ngor, Chung and police assistant commissioner Joe Chan Tung, who heads police's cyber security and technology crime bureau.
from us


Telegram Golang вопросы собеседований
FROM American