PyMalloc группирует небольшие выделения по классам размеров: arena содержит pools, а pool разбит на blocks одного размера. Освобождённый block обычно переиспользуется, а не немедленно отдаётся ОС.
Каким образом менеджер памяти CPython (PyMalloc) оптимизирует выделение памяти под мелкие объекты размером до 512 байт? Как устроена иерархия структур Arena, Pool и Block, и почему память, освобождённая Python, далеко не всегда возвращается операционной системе?
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.