Управление контролем выделения памяти
| Существует две версии этой функции. Стандартная объявлена в <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
байт) и для больших: - Маленькие блоки выделяются с помощью механизма фиксированных групп (bands) – аллокатор получает область памяти размером
MALLOC_ARENA_SIZE
и делит ее на группы меньшего размера. - Большие блоки выделяются другим образом – аллокатор получает от системы память, размер которой кратен
MALLOC_ARENA_SIZE
, и в ней выделяет блок требуемого размера, а оставшееся пространство помещается в список свободных блоков.
Например, при совершении следующих выделений памяти: 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
- Включить/отключить проверку выхода за границы при операциях с памятью и строками. Допустимые значения:
-
0
– проверки отключены -
≠0
– проверки включены
Переменная окружения, аналогичная команде: MALLOC_CKACCESS. - MALLOC_CKACCESS_LEVEL
- Уровень проверки, которую выполняет функция mallopt() при запуске с опцией
MALLOC_CKACCESS
.
Переменная окружения, аналогичная команде: MALLOC_CKACCESS_LEVEL. - MALLOC_CKALLOC
- Включить/отключить проверку аргументов функций *alloc() и free(). Допустимые значения:
-
0
– проверки отключены -
≠0
– проверки включены
Переменная окружения, аналогичная команде: MALLOC_CKALLOC. - MALLOC_CKBOUNDS
- Включить/отключить проверку границ области заполнения. Допустимые значения:
-
0
– проверки отключены -
≠0
– проверки включены
Переменная окружения, аналогичная команде: MALLOC_CKBOUNDS. - MALLOC_CKCHAIN
- Включить/отключить полную проверку внутренних списков страниц аллокатора. Для отладочной версии mallopt() эта команда аналогична
MALLOC_VERIFY_ON
. Допустимые значения: -
0
– проверки отключены -
≠0
– проверки включены
Переменная окружения, аналогичная команде: MALLOC_CKCHAIN. - MALLOC_DUMP_LEAKS
- Включить/отключить поиск утечек памяти при завершении процесса. Данная опция управляет дополнительными проверками в библиотеке, дамп которых записывается в файл, путь к которому указан в одноимённой переменной окружения. Допустимые значения:
-
0
– проверки отключены -
≠0
– проверки включены
Соответствующая переменная окружения: MALLOC_DUMP_LEAKS. - MALLOC_EVENTBTDEPTH
- Уровень вложенности трассировки для сообщения о проблемах с памятью. По умолчанию равно
5
.
Переменная окружения, аналогичная команде: MALLOC_EVENTBTDEPTH. - MALLOC_START_TRACING
- Включить/отключить автоматическую трассировку событий аллокатора памяти при старте программы. Если трассировка не была включена при старте программы, можно включить её с помощью данного API, либо с помощью интерфейса управляющего потока. Допустимые значения:
-
0
– проверки отключены -
1
– проверки включены
Переменная окружения, аналогичная команде: 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 системной библиотеки