Что такое арена в выделении памяти в Python
Что проверяют
Понимаете ли вы, что за созданием обычного объекта стоит не прямой вызов системного malloc, а собственный аллокатор CPython. Вопрос про арену это вход в разговор о pymalloc, о фрагментации и о том, почему память процесса не возвращается операционной системе сразу после del.
Как отвечать
У pymalloc три уровня: блок, пул, арена.
Арена это крупный непрерывный кусок, который интерпретатор запрашивает у операционной системы через mmap. Внутри арены лежат пулы размером со страницу (4 КиБ), и каждый пул обслуживает один размерный класс. Блок это кусочек внутри пула, выровненный по восемь или шестнадцать байт.
Через pymalloc проходят только мелкие объекты, не больше 512 байт. Всё, что крупнее, уходит напрямую в системный аллокатор.
Смысл конструкции один: обращение к системе стоит системного вызова, а мелких объектов интерпретатор создаёт миллионы за секунду. Арена позволяет взять память оптом и раздавать её внутри процесса, попадая в уже прогретые страницы.
Важная деталь: арена отдаётся обратно системе, только когда освобождены все её пулы. Посмотреть картину можно через sys._debugmallocstats(). Исторический размер арены 256 КиБ, в современных версиях он больше; точную цифру называть не обязательно, важна логика уровней.
Где спотыкаются
Считают, что через арены проходит вся память процесса. Большой массив, буфер или длинная строка идут мимо pymalloc, и разговор про экономию на мелких объектах к ним не относится.
Обещают, что после del и gc.collect() потребление памяти упадёт. Пока в арене жив хоть один блок, вся арена остаётся за процессом, поэтому после обработки большого списка потребление часто не возвращается. Лечится это не сборщиком, а потоковой обработкой или отдельным процессом под тяжёлую задачу.
Переносят рассуждение на любую сборку. Описанная схема относится к CPython с глобальной блокировкой интерпретатора: в экспериментальных сборках без неё аллокатор другой, а в альтернативных реализациях речи о пулах и аренах не идёт вовсе.