(Для Go 1.8 - первый квартал 2017 года см. Ниже )
Следующий параллельный сборщик мусора в Go 1.5 включает в себя возможность «ускорять», - сказал gc.
Вот предложение, представленное в этой статье, которое может быть использовано для Go 1.5, но также помогает понять gc в Go.
Вы можете увидеть состояние до 1.5 (Stop The World: STW)
До Go 1.5 в Go использовался параллельный коллектор остановки мира (STW).
Хотя у коллекции STW много недостатков, она, по крайней мере, имеет предсказуемое и контролируемое поведение роста кучи.
(Фотография с презентации GopherCon 2015 « Go GC: решение проблемы задержки в Go 1.5 »)
Единственной ручкой настройки для коллектора STW была «GOGC», относительный рост кучи между коллекциями. Параметр по умолчанию, 100%, запускал сборку мусора каждый раз, когда размер кучи удваивался по сравнению с размером активной кучи, как при предыдущей сборке:
Время ГХ в коллекторе STW.
Go 1.5 представляет параллельный сборщик .
Это имеет много преимуществ по сравнению со сборкой STW, но усложняет управление ростом кучи, поскольку приложение может выделять память во время работы сборщика мусора .
(Фотография с презентации GopherCon 2015 « Go GC: решение проблемы задержки в Go 1.5 »)
Чтобы достичь того же предела роста кучи, среда выполнения должна запускать сборку мусора раньше, но насколько раньше зависит от многих переменных, многие из которых невозможно предсказать.
- Слишком рано запустить сборщик, и приложение будет выполнять слишком много сборок мусора, тратя ресурсы ЦП.
- Запустите сборщик слишком поздно, и приложение превысит желаемый максимальный рост кучи.
Достижение правильного баланса без ущерба для параллелизма требует аккуратной синхронизации сборщика мусора.
Скорость сборки мусора направлена на оптимизацию по двум направлениям: рост кучи и использование ЦП сборщиком мусора.
Схема стимуляции ГХ состоит из четырех компонентов:
- оценка объема сканирования, который потребуется для цикла ГХ,
- механизм, позволяющий мутаторам выполнять предполагаемый объем работы по сканированию к тому моменту, когда выделение кучи достигает целевого значения кучи,
- планировщик для фонового сканирования, когда мутатор помогает недоиспользовать бюджет ЦП, и
- пропорциональный контроллер для триггера ГХ.
Дизайн уравновешивает два разных взгляда на время: время процессора и время кучи .
- Процессорное время похоже на время стандартных настенных часов, но проходит в
GOMAXPROCS
разы быстрее.
То есть, если GOMAXPROCS
равно 8, то восемь секунд процессора проходит каждую секунду стены и GC получает две секунды процессорного времени каждую секунду стены.
Планировщик ЦП управляет временем ЦП.
- Время кучи измеряется в байтах и продвигается вперед по мере выделения мутаторами.
Связь между временем кучи и временем стены зависит от скорости выделения и может постоянно меняться.
Мутатор помогает управлять течением времени кучи, гарантируя, что предполагаемая работа сканирования будет завершена к тому времени, когда куча достигнет целевого размера.
Наконец, контроллер триггера создает цикл обратной связи, который связывает эти два представления времени вместе, оптимизируя как время кучи, так и время ЦП.