PyMalloc группирует небольшие выделения в блоки классов размеров, pools и arenas. Освобождение объекта часто возвращает блок внутреннему аллокатору, а не немедленно ОС.
Каким образом менеджер памяти CPython (PyMalloc) оптимизирует выделение памяти под мелкие объекты размером до 512 байт? Как устроена иерархия Arena, Pool и Block, и почему память, освобождённая Python, далеко не всегда возвращается операционной системе (malloc vs free)?
PyMalloc группирует небольшие выделения в блоки классов размеров, pools и arenas. Освобождение объекта часто возвращает блок внутреннему аллокатору, а не немедленно ОС.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
PyMalloc группирует небольшие выделения в блоки классов размеров, pools и arenas. Освобождение объекта часто возвращает блок внутреннему аллокатору, а не немедленно ОС.
Pool обслуживает блоки определённого размера, arena содержит pools. Пока в arena остаются живые объекты, вернуть её целиком сложно; фрагментация удерживает память. PyMalloc традиционно обслуживает запросы до 512 байт, большие идут другим путём. Детали зависят от версии и сборки: например, free-threaded CPython использует другой allocator. free на нижнем уровне также не гарантирует немедленного падения RSS.
Источник: docs.python.org.