mallopt()

Управление контролем выделения памяти


Note: Существует две версии этой функции. Стандартная объявлена в <malloc/malloc.h> является частью системной библиотеки и не содержит механизмов отладки и контроля корректности выделения памяти.

Отладочная версия функции объявлена в <rcheck/malloc.h>. Она включает дополнительные команды и настройки. Для использования отладочной версии функции mallopt() необходимо компилировать программу с libmalloc.so или использовать LD_PRELOAD=libmalloc.so во время выполнения.


Начиная с редакции 2021 библиотека libmalloc считается устаревшей

Прототип:

#include <malloc/malloc.h>
int mallopt( int cmd,
int value );

Аргументы:

cmd
Команда или опция для применения. Стандартная и отладочная версии mallopt() могут запускаться со следующими значениями:
MALLOC_ARENA_SIZE
MALLOC_ARENA_CACHE_FREE_NOW
MALLOC_ARENA_CACHE_MAXBLK
MALLOC_ARENA_CACHE_MAXSZ
MALLOC_FREE_CHECK
MALLOC_MEMORY_HOLD
MALLOC_STATS
MALLOC_VERIFY_ON

Отладочная версия дополнительно поддерживает:
MALLOC_CKACCESS
MALLOC_CKALLOC
MALLOC_CKBOUNDS
MALLOC_CKCHAIN
MALLOC_DUMP_LEAKS
MALLOC_EVENTBTDEPTH
MALLOC_START_TRACING
MALLOC_TRACEMIN
MALLOC_TRACEMAX
MALLOC_TRACEBTDEPTH
MALLOC_TRACING
MALLOC_VERIFY
MALLOC_FATAL
MALLOC_WARN
value
Значение опции.

Библиотека:

libc

Описание:

Функция mallopt() позволяет контролировать распределение памяти (отладочная версия также включает дополнительные механизмы контроля корректности выделения памяти).

Есть возможность установить параметры выделения и контроля памяти через переменные окружения. Это позволяет осуществлять контролировать выделение памяти без изменения исходного кода программы.

Контроль параметров выделения памяти

Аргумент cmd может принимать следующие значения:

MALLOC_ARENA_SIZE
Размер региона памяти, который аллокатор получает от системы. Также регулирует размер, на который регион будет увеличен при необходимости. Значение по умолчанию 32 KB, что приводит к резервированию аллокатором 64 KB памяти. Можно уменьшить это значение, но назмер должен быть кратен 4 KB (размеру страницы памяти) и в настоящее время не должен превышать 256 KB. Аллокатор вделяет память страницами и из них выделяет фрагменты требуемого размера.

Если value равно 0, mallopt() вернёт текущий размер региона. Если установить другое значение value, mallopt() вернёт предыдущий размер региона.

Аллокатор по-разному выделяет память для маленьких блоков (меньше 128 байт) и для больших: Например, при совершении следующих выделений памяти:

malloc( 100 );
malloc( 200 );

система создаст регион размером 32 KB и поделит ее на группы меньшего размера и из них выделит фрагмент в 128 байт для обслуживания 100-байтной аллокации. Второй регион размером 32 KB будет создан для обслуживания выделения памяти на 200-байт.

Уменьшение MALLOC_ARENA_SIZE может помочь уменьшить потребление памяти.

Переменная окружения, аналогичная команде: MALLOC_ARENA_SIZE.

MALLOC_ARENA_CACHE_FREE_NOW
Если значение value равно 1, память кэша аллокатора возвращается системе немедленно по мере освобождения используемых ресурсов и может быть освобождена полностью. Если значение value равно 0, память кэша аллокатора также возвращается системе немедленно, но его размер будет соответствовать настройкам MALLOC_ARENA_CACHE_MAXBLK и MALLOC_ARENA_CACHE_MAXSZ.
MALLOC_ARENA_CACHE_MAXBLK
Максимальное число блоков внутри кэша региона. Кэш используется для удержания страниц памяти при вызове free() без возвращения их системе. Для отключени кэширования блоков данных достаточно установить значение 0. Это приведет к потерям производительности, так как аллокатор должен будет регулярно выполнять системный вызов для выделения и освобождения страниц памяти средствами ядра.

Переменная окружения, аналогичная команде: MALLOC_ARENA_CACHE_MAXBLK.
MALLOC_ARENA_CACHE_MAXSZ
Общий размер кэшированных блоков региона.

Переменная окружения, аналогичная команде: MALLOC_ARENA_CACHE_MAXSZ.
MALLOC_FREE_CHECK
Если значение value равно 1, будет включена проверка на повторное освобождение блока памяти (освобождение уже освобожденной памяти) в функции free(). Эта опция может использоваться только при использовании библиотеки libmalloc.so. При использовании вместе с libmalloc.so при попытке освободить ранее освобождённый блок произойдёт вызов assert().
MALLOC_MEMORY_HOLD
Если значение value равно 1, аллокатор не будет возвращать память из кэша региона системе.

Переменная окружения, аналогичная команде: MALLOC_MEMORY_HOLD.
MALLOC_STATS
Получить статистику текущего состояния аллокатора. Аргумент value должен быть указателем на структуру malloc_stats (определена в <malloc.h>). Для структуры необходимо заранее выделить память:

struct malloc_stats ms;
...
mallopt( MALLOC_STATS, &ms );

MALLOC_VERIFY_ON
Если значение value равно 1, все действия аллокатора подвергаются дополнительным проверкам. Если проверка оказывается не пройденной, аллокатор памяти вызывает assert(). Для отладочной версии mallopt() эта команда аналогична MALLOC_CKCHAIN.

Контроль корректности выделения памяти

При использовании отладочной версии mallopt() можно использовать дополнительные возможности:

MALLOC_CKACCESS
Включить/отключить проверку выхода за границы при операциях с памятью и строками. Допустимые значения: Переменная окружения, аналогичная команде: MALLOC_CKACCESS.
MALLOC_CKACCESS_LEVEL
Уровень проверки, которую выполняет функция mallopt() при запуске с опцией MALLOC_CKACCESS.

Переменная окружения, аналогичная команде: MALLOC_CKACCESS_LEVEL.
MALLOC_CKALLOC
Включить/отключить проверку аргументов функций *alloc() и free(). Допустимые значения: Переменная окружения, аналогичная команде: MALLOC_CKALLOC.
MALLOC_CKBOUNDS
Включить/отключить проверку границ области заполнения. Допустимые значения: Переменная окружения, аналогичная команде: MALLOC_CKBOUNDS.
MALLOC_CKCHAIN
Включить/отключить полную проверку внутренних списков страниц аллокатора. Для отладочной версии mallopt() эта команда аналогична MALLOC_VERIFY_ON. Допустимые значения: Переменная окружения, аналогичная команде: MALLOC_CKCHAIN.
MALLOC_DUMP_LEAKS
Включить/отключить поиск утечек памяти при завершении процесса. Данная опция управляет дополнительными проверками в библиотеке, дамп которых записывается в файл, путь к которому указан в одноимённой переменной окружения. Допустимые значения: Соответствующая переменная окружения: MALLOC_DUMP_LEAKS.
MALLOC_EVENTBTDEPTH
Уровень вложенности трассировки для сообщения о проблемах с памятью. По умолчанию равно 5.

Переменная окружения, аналогичная команде: MALLOC_EVENTBTDEPTH.
MALLOC_START_TRACING
Включить/отключить автоматическую трассировку событий аллокатора памяти при старте программы. Если трассировка не была включена при старте программы, можно включить её с помощью данного API, либо с помощью интерфейса управляющего потока. Допустимые значения: Переменная окружения, аналогичная команде: MALLOC_START_TRACING.
MALLOC_TRACEMIN
Минимальный размер памяти в байтах, выделение которой будет отмечается в трассе.

Переменная окружения, аналогичная команде: MALLOC_TRACEMIN.
MALLOC_TRACEMAX
Максимальный размер памяти в байтах, выделение которой будет отмечаться в трассе. Значение 0 соответствует отсутствию ограничений.

Переменная окружения, аналогичная команде: MALLOC_TRACMAX.
MALLOC_TRACEBTDEPTH
Уровень трассировки для выделений памяти. По умолчанию равно 5.

Переменная окружения, аналогичная команде: MALLOC_TRACEBTDEPTH.
MALLOC_TRACING
Включить/отключить трассировку аллокаций памяти.

Переменная окружения, аналогичная команде: MALLOC_TRACING.
MALLOC_VERIFY
Выполнить проверку внутренних списков страниц аллокатора для всех блоков. При обнаружении ошибки будет произведена её обработка (обычно выражается в прерывании программы). Аргумент value игнорируется, следует установить значение 1.
MALLOC_FATAL Указать обработчик критических ошибок функции malloc(). Допустимые значения:
Имя константы Значение Описание
M_HANDLE_IGNORE 0 Игнорировать ошибку и продолжить исполнение
M_HANDLE_ABORT 1 Завершить исполнение программы с вызовом abort()
M_HANDLE_EXIT 2 Немедленно завершить исполнение программы
M_HANDLE_CORE 3 Создать дамп памяти программы
M_HANDLE_STOP 4 Остановить исполнение процесса сигналом SIGSTOP
Переменная окружения, аналогичная команде: MALLOC_FATAL.
MALLOC_WARN
Указать обработчик предупреждений для функции malloc. Значения аргумента value такие же, как у MALLOC_FATAL.

Переменная окружения, аналогичная команде: MALLOC_WARN.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Для команды MALLOC_ARENA_SIZE со значением value равным 0, mallopt() возвращает текущий размер региона, с иным значением value mallopt() возвращает предыдущий размер региона.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

calloc(), free(), mallinfo(), malloc(), realloc()




Предыдущий раздел: Описание API системной библиотеки