Что такое heap и как он устроен
Что проверяют
Понимаете ли вы, что в Go попадает в кучу и почему, и не путаете ли кучу как область памяти с двоичной кучей как структурой данных. Вопрос быстро уходит в анализ побегов и давление на сборщик, потому что именно там у Go болит производительность.
Как отвечать
Сначала снимите двусмысленность. В разговоре про память heap это область для объектов, время жизни которых не ограничено кадром вызова, а в разговоре про алгоритмы это двоичная куча из container/heap с логарифмической вставкой и извлечением.
По памяти: куча управляется аллокатором в стиле TCMalloc. Память нарезана на спаны, мелкие объекты раскладываются по классам размеров, у каждого процессора свой локальный кэш, за ним центральный список и общая куча, крупные объекты получают спан напрямую. Дерева с потомками тут нет, это про другую кучу.
Главное отличие от привычных языков: размещение выбирает компилятор. Локальная переменная уедет в кучу, если указатель на неё переживает функцию, если размер неизвестен при компиляции, если значение попадает в интерфейс или в замыкание. Смотреть это надо не на глаз:
go build -gcflags='-m' ./...Сборщик конкурентный, трёхцветный, с барьером записи и без перемещения объектов. Частоту задают GOGC и GOMEMLIMIT, а стоимость измеряют профилем памяти, а не догадками.
Где спотыкаются
Отвечают, что куча это дерево со ссылками на потомков. Описание структуры данных подставлено вместо описания менеджера памяти, и дальше разговор про классы размеров и про стоимость выделения уже не идёт.
Уверены, что new и make всегда дают кучу, а обычная переменная стек. Решает анализ побегов: выделенное через new может остаться на стеке, а безобидная локальная строка уехать в кучу. Без привычки читать вывод компилятора такой кандидат оптимизирует наугад.
Считают, что сборщик снимает вопрос утечек. Живая ссылка в глобальной карте, забытая горутина, срез, удерживающий целиком большой массив, держат память не хуже забытого освобождения. Отдельная путаница это освободили и вернули операционной системе: потребление по системным счётчикам падает не сразу, и судить по нему о реальном расходе нельзя.