Go использует собственный аллокатор памяти, основанный на TCMalloc. Куча разбита на арены (spans) разного размера — мелкие объекты (<32KB) выделяются из кешей P (mcache → mcentral → mheap), крупные — напрямую из mheap.
Каждый P имеет свой локальный кеш (mcache), что снижает contention. Объекты группируются по size classes (~70 классов), чтобы минимизировать фрагментацию.
Когда mcache пуст — он запрашивает span у mcentral, а тот у mheap. Если mheap не хватает — запрашивается память у ОС через mmap.