Сборка мусора в Go происходит параллельно с приложением или нет
Что проверяют
Знаете ли вы, что сборщик конкурентный, и при этом не впадаете ли в крайность, будто пауз нет вовсе. Дальше смотрят, понимаете ли вы, чем оплачена эта конкурентность и какими ручками она настраивается.
Как отвечать
Да, сборщик в Go работает одновременно с приложением. Это трёхцветная пометка с барьером записи: горутины продолжают исполняться, пока идёт маркировка, а барьер следит, чтобы новая ссылка не спрятала живой объект от сборщика.
Полной остановки мира нет в том смысле, что она не длится всю сборку. Короткие остановки есть на границах фаз, когда барьер включается и выключается. Их длительность измеряется долями миллисекунды и не растёт пропорционально размеру кучи.
Цена конкурентности такая: маркировка отъедает часть процессорного времени, и горутина, которая аллоцирует быстрее, чем сборщик успевает, сама вовлекается в маркировку. Поэтому всплеск аллокаций выглядит как замедление именно того кода, который аллоцирует.
Ручки стоит назвать: GOGC задаёт, насколько куче разрешено вырасти относительно живых данных прошлой сборки, GOMEMLIMIT ставит мягкий потолок памяти, GODEBUG=gctrace=1 и runtime/trace показывают, что происходит на самом деле. Лучшая оптимизация всё равно про аллокации: переиспользование буферов, make с заранее известной ёмкостью, меньше указателей в горячих структурах.
Где спотыкаются
Отвечают одним словом и попадают в крайность. Вариант «параллельно, пауз нет» неверен, короткие остановки существуют. Вариант «мир стоит, как было в старых средах» неверен тоже. Точная формулировка: маркировка конкурентная, остановки короткие и только на границах фаз.
Второе: приписывают сборщику уплотнение памяти. Он не перемещает объекты, поэтому адреса стабильны, компактизации нет, а с фрагментацией работает аллокатор через размерные классы.
Третье: путают освобождение памяти и возврат её операционной системе. После сборки потребление процесса может оставаться высоким ещё долго, и в контейнере с жёстким лимитом помогает GOMEMLIMIT, а не вызов сборки руками.