Что такое мемориалокаторы в Go, например арены, страницы, mspan, mcentral
Что проверяют
Насколько глубоко вы знаете рантайм, а не только синтаксис. Вопрос сигнальный: по нему видно, разбирали ли вы устройство кучи или знакомы с аллокатором по пересказам. Практический смысл в том, чтобы понимать, откуда берётся быстрый путь выделения и почему объект в горячем цикле лучше не отдавать в кучу вовсе.
Как отвечать
Идите сверху вниз по уровням.
Куча резервируется крупными регионами, аренами; для каждой арены рантайм держит метаданные, по которым определяет, принадлежит ли адрес куче и где лежит битовая карта указателей. Единица учёта внутри арены это страница фиксированного размера, кратно ей и выдаётся память.
Структура mspan это непрерывный набор страниц, нарезанный на ячейки одного класса размера. Классов около семидесяти, они покрывают объекты примерно до тридцати двух килобайт; объект крупнее получает собственный набор страниц прямо из кучи.
Кэш mcache это по одному span на класс размера, привязанный к каждому исполнителю горутин. Выделение мелкого объекта в типичном случае это взятие свободной ячейки из своего span без единой блокировки, поэтому оно и стоит считанные наносекунды.
Список mcentral общий на процесс, по одному на класс размера. К нему идут, когда свой span кончился, и берут новый под блокировкой. Опустевшие span уходят обратно в кучу, а та при нехватке просит память у операционной системы.
Добавьте про мелочь: совсем маленькие объекты без указателей склеиваются по нескольку в одну ячейку отдельным аллокатором.
Где спотыкаются
Говорят, что освобождённый объект возвращается в mcentral. Отдельные объекты рантайм не возвращает: освобождение это работа сборщика, который по битовой карте помечает ячейки свободными, и наверх уходит только целиком пустой span.
Путают уровни: называют ареной то, что на деле span, а страницей то, что класс размера. Достаточно один раз назвать цепочку арена, страница, span, mcache, mcentral, куча по порядку, и вопрос закрыт.
Не связывают всё это с анализом убегания. Самый дешёвый путь выделения это его отсутствие: объект, не убежавший в кучу, живёт на стеке и аллокатора не касается, и именно про это обычно спрашивают следующим вопросом.