Какие существуют триггеры для запуска сборщика мусора (Garbage Collector) в Go?

Ответ

Сборщик мусора (GC) в Go запускается автоматически и конкурентно, минимизируя паузы в работе приложения (Stop-The-World). Существует три основных триггера для его запуска:

  1. Достижение порога по памяти (основной триггер). GC запускается, когда объем новой выделенной памяти достигает определенного порога. Этот порог вычисляется на основе переменной окружения GOGC (по умолчанию 100). GOGC=100 означает, что сборка мусора начнется, когда размер кучи (heap) станет в два раза больше, чем размер живых объектов после предыдущей сборки.

  2. Принудительный запуск. Разработчик может вручную запустить сборку мусора, вызвав функцию runtime.GC(). Это блокирующий вызов, который дожидается окончания цикла GC. Обычно используется для отладки или в специфических сценариях, когда нужно освободить память немедленно.

    import "runtime"
    
    // ...
    runtime.GC() // Принудительно запускаем полный цикл сборки мусора
  3. По таймеру. Если сборка мусора не запускалась в течение определенного времени (по умолчанию 2 минуты), система может запустить ее принудительно. Это гарантирует, что даже в приложениях с низким уровнем аллокаций память будет периодически очищаться.

Для отладки и анализа работы GC можно использовать переменную окружения GODEBUG=gctrace=1, которая будет выводить в консоль подробную информацию о каждом цикле сборки.