Google выпустил систему распределения памяти TCMalloc в форме отдельной библиотеки

Компания Google представила обновлённый вариант системы распределения памяти TCMalloc. Первый вариант TCMalloc был открыт в 2005 году и поставлялся в составе пакета gperftools (Google Performance Tools). Отныне TCMalloc, который используется во многих внутренних проектах Google, решено распространять в виде отдельного проекта. Код TCMalloc написан на С++ и доступен под лицензией Apache.

TCMalloc включает реализацию Си-функции malloc() и С++ оператора «new», оптимизированных для достижения высокой производительности и применения в многопоточных приложениях. TCMalloc также предоставляет возможности интроспекции и профилирования, позволяющие приложению получить подробные сведения об использовании памяти в куче. В коде применяются оптимизации на основе современных возможностей языка C++, таких как оператор delete с указанием размера из C++14 и выделение памяти с выравниванием из C++17.

TCMalloc состоит из трёх компонентов: фронтэнда с кэшем для быстрого выделения и освобождения памяти, прослойки для наполнения кэша фронтэнда и бэкенда, выполняющего такие операции, как получение памяти от операционной системы, управления большими кусками неиспользованной памяти и возвращение лишней памяти обратно в ОС. Кэш избавлен от блокировок и работает в привязке к ядрам CPU, но откатывается на модель кэширования в привязке к потокам в случае отсутствия необходимой функциональности в ядре ОС (привязка кэша к CPU работает только в свежих ядрах Linux). Бэкенд поддерживает работу как с обычными страницами памяти, так и со страницами увеличенного размера (hugepage).

Основные особенности TCMalloc:

  • Быстрое выделение и освобождение памяти с использованием кэширования. Большинство операций выделения памяти не требуют блокировки, что обеспечивает хорошую масштабируемость для многопоточных приложений;
  • Гибкое использование памяти, позволяющее повторно использовать освобождённые области памяти для объёктов различного размера или возвращать память операционной системе;
  • Низкие накладные расходы на каждый объект за счёт выделения страниц объектов одинакового размера и эффективное по представление мелких объектов;
  • Предоставление детальной информации для анализа использования памяти приложением.

Источник: http://www.opennet.ru/opennews/art.shtml?num=52364