← Назад к вопросам

Когда запускается сборщик мусора?

1.8 Middle🔥 171 комментариев
#Другое#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принципы запуска сборщика мусора в Go

В языке Go сборщик мусора (Garbage Collector, GC) запускается не по фиксированному расписанию или внешнему сигналу, а по внутренним триггерам, основанным на росте объема памяти и состоянии системы. Основные триггеры следующие:

1. Достижение порога размера heap

Go отслеживает текущий размер кучи (heap). Когда объем выделенной памяти достигает значения GOGC (по умолчанию 100%), запускается сборка мусора. Параметр GOGC определяет процент роста кучи относительно размера живой памяти (живые объекты после предыдущей сборки). Формула:
целевой размер кучи = текущий размер живой памяти * (1 + GOGC/100).

// Пример: если живая память после GC = 10MB, GOGC=100%, 
// то GC запустится при heap ~20MB.
// Можно управлять через переменную окружения:
// export GOGC=50  // более частые сборки
// export GOGC=200 // более редкие сборки (экономия CPU)

2. Системные триггеры (редкие случаи)

  • Принудительный вызов runtime.GC() (синхронная сборка).
  • Вызов debug.FreeOSMemory() (возвращает память ОС).
  • Системные события: нехватка памяти ОС (через malloc), но это крайний случай.

3. Фоновый режим и циклы сборки

GC работает в конкурентном режиме, совмещая сборку с исполнением программы:

  • Фоновый маркирование (Background marking) — запускается при росте heap и работает параллельно.
  • Финальная сборка (Sweep) — выполняется по мере необходимости после маркирования.

Ключевые особенности алгоритма GC в Go

Трехцветный алгоритм маркирования (tri-color mark-and-sweep):

// Псевдо-процесс:
// 1. Все объекты белые (не проверены).
// 2. Корни (глобальные переменные, стек) -> серые (обрабатываются).
// 3. Переход серых -> черные (живые объекты).
// 4. Белые объекты удаляются (мусор).

Контролируемые паузы (STW — Stop The World):

  • Полная остановка программы лишь на короткие этапы (корневая扫描, финальная清理).
  • В современных версиях (Go 1.8+) STW сокращены до микросекунд.

Как управлять GC в программе?

  • Мониторинг: профилирование через pprof, трассировка runtime/trace.
  • Тонкая настройка: переменная GOGC, вызов runtime.GC() (только для тестов).
  • Оптимизация: уменьшение числа указателей, использование пулов для объектов.
import "runtime/debug"

// Установка целевых параметров GC (Go 1.19+)
debug.SetGCPercent(100) // аналогично GOGC=100

// Принудительная сборка (не рекомендуется в production)
runtime.GC()

Важно: GC в Go — автоматический и недетерминированный. Нельзя точно предсказать момент запуска, но можно анализировать через профилирование. Оптимальная стратегия — не вмешиваться в GC, а оптимизировать аллокации и структуры данных.

Когда запускается сборщик мусора? | PrepBro