Каким образом менеджер памяти CPython (PyMalloc) оптимизирует выделение памяти под мелкие объекты размером до 512 байт? Как устроена иерархия структур Arena, Pool и Block, и почему память, освобождённая Python, далеко не всегда возвращается операционной системе?

PyMalloc группирует небольшие выделения по классам размеров: arena содержит pools, а pool разбит на blocks одного размера. Освобождённый block обычно переиспользуется, а не немедленно отдаётся ОС.

Короткий ответ

Что ответить на собеседовании

PyMalloc группирует небольшие выделения по классам размеров: arena содержит pools, а pool разбит на blocks одного размера. Освобождённый block обычно переиспользуется, а не немедленно отдаётся ОС.

Подробный разбор

Ответ с пояснениями

PyMalloc группирует небольшие выделения по классам размеров: arena содержит pools, а pool разбит на blocks одного размера. Освобождённый block обычно переиспользуется, а не немедленно отдаётся ОС.

Так уменьшаются обращения к системному allocator и накладные расходы на частые маленькие выделения. Пока в arena остаются живые объекты, её нельзя целиком вернуть; фрагментация и кеши удерживают RSS даже после удаления множества объектов. Крупные запросы памяти обрабатываются другим путём. Размеры arena и pool зависят от версии и сборки, а free-threaded CPython использует другой allocator по умолчанию — mimalloc. Поэтому отсутствие падения RSS само по себе не доказывает утечку ссылок.

Источник: docs.python.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее