Provided by: manpages-ru_4.21.0-2_all 

ИМЯ
memusage - исследует использование памяти программы
СИНТАКСИС
memusage [параметры]… программа [параметры_программы]…
ОПИСАНИЕ
Программа memusage представляет собой сценарий bash, который описывает использование памяти программой.
Сценарий загружает библиотеку libmemusage.so в окружение вызывающего (через переменную окружения
LD_PRELOAD, смотрите ld.so(8)). Библиотека libmemusage.so отслеживает распределение памяти путём
перехвата вызовов malloc(3), calloc(3), free(3) и realloc(3); при необходимости, также могут быть
перехвачены вызовы mmap(2), mremap(2) и munmap(2).
memusage может выводить собранные данные в текстовом виде, также может использовать memusagestat(1)
(смотрите вариант -р далее) для того, чтобы создать файл PNG, содержащий графическое представление
собранных данных.
Сводка использование памяти
Выводимая memusage строка "сводка использование памяти" содержит три поля:
heap total
Сумма аргументов size всех вызовов malloc (3), результат аргументов (nmemb*size) всех
вызовов calloc(3) и сумма аргументов length всех вызовов mmap (2) . В случае realloc (3) и
mremap (2), если новый размер блока адресов больше, чем в предыдущий размер, добавляется сумма
всех таких различий (новый размер минус старый размер).
heap peak
Максимальное значение всех аргументов size у malloc(3), все произведения nmemb*size у
calloc(3), все аргументы size у realloc(3), аргументы length у mmap(2) и аргументы new_size у
mremap(2).
stack peak
Перед первым вызовом любой отслеживаемой функции сохраняется адрес указателя стека (базовый
указатель стека). После каждого вызова функции читается текущий адрес указателя стека и
вычисляет разница с базовым указателем стека. Максимальное значение среди вычитаний является
пиком стека.
Сразу за строкой итога в таблице для каждой перехваченной функции показывается количество вызовов, общее
количество выделенной и освобождённой памяти и количество вызовов с ошибками. Для realloc(3) и mremap(2)
также есть поле «nomove», показывающее переразмещения, у которых изменился адрес блока, и поле «dec»,
показывающее переразмещения, у которых уменьшился размер блока. Для realloc(3) в дополнительном поле
«free» показываются переразмещения, которые были вызваны освобождением блока (т. е., размер
переразмещения был равен 0).
Таблица «realloc/total memory», выводимая memusage, не отражает случаи, где realloc(3) используется для
переразмещения блока памяти меньшего размера, чем предыдущий. Это может привести к тому, что сумма всех
ячеек «total memory» (кроме «free») будет больше, чем ячейка «free/total memory».
Гистограмма размеров блоков
«Гистограмма размеров блоков» выдает разбивку адресованных блоков по размерам.
ПАРАМЕТРЫ
-n имя, --progname=имя
Имя файла профилируемой программы.
-p file, --png=file
Создать изображение в формате PNG и сохранить его в file.
-d файл, --data=файл
Создать двоичный файл данных и сохранить его в файл.
-u, --unbuffered
Не буферизуйте вывод.
-b size, --buffer=size
Собрать size записей перед тем, как записать их.
--no-timer
Отключить измерение значения указателя стека на основе таймера (SIGPROF).
-m, --mmap
Также трассировать mmap(2), mremap(2) и munmap(2).
-?, --help
Показать справку по использованию и завершить работу.
--usage
Показать короткое сообщение об использовании и завершить работу.
-V, --version
Показать информацию о версии и завершить работу.
Следующие параметры применяются только когда используется графический вывод:
-t, --time-based
По оси X — время (а не количество вызовов функций).
-T, --total
Построить также график общего использования памяти.
--title=название
Использовать название в качестве заголовка графика.
-x size, --x-size=size
Рисовать график шириной в size пикселов.
-y size, --y-size=size
Рисовать график высотой в size пикселов.
КОД РЕЗУЛЬТАТА
Код завершения memusage равен коду завершения профилируемой программы.
ДЕФЕКТЫ
Сообщения об ошибках доступны по адресу http://www.gnu.org/software/libc/bugs.html
ПРИМЕРЫ
Ниже показана простая программа, которая переразмещает блок памяти в цикле, который достигает пика до
того как размер циклически переразмещаемой памяти достигнет нуля. После компиляции программы и запуска
следующих команд график использования памяти программой можно найти в файле memusage.png:
$ memusage --data=memusage.dat ./a.out
...
Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224
total calls total memory failed calls
malloc| 1 400 0
realloc| 40 44800 0 (nomove:40, dec:19, free:0)
calloc| 0 0 0
free| 1 440
Histogram for block sizes:
192-207 1 2% ================
...
2192-2207 1 2% ================
2240-2255 2 4% =================================
2832-2847 2 4% =================================
3440-3455 2 4% =================================
4032-4047 2 4% =================================
4640-4655 2 4% =================================
5232-5247 2 4% =================================
5840-5855 2 4% =================================
6432-6447 1 2% ================
$ memusagestat memusage.dat memusage.png
Исходный код программы
#include <stdio.h>
#include <stdlib.h>
#define CYCLES 20
int
main(int argc, char *argv[])
{
int i, j;
size_t size;
int *p;
size = sizeof(*p) * 100;
printf("malloc: %zu\n", size);
p = malloc(size);
for (i = 0; i < CYCLES; i++) {
if (i < CYCLES / 2)
j = i;
else
j--;
size = sizeof(*p) * (j * 50 + 110);
printf("realloc: %zu\n", size);
p = realloc(p, size);
size = sizeof(*p) * ((j + 1) * 150 + 110);
printf("realloc: %zu\n", size);
p = realloc(p, size);
}
free(p);
exit(EXIT_SUCCESS);
}
СМ. ТАКЖЕ
memusagestat(1), mtrace(1), ld.so(8)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey
<a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>,
Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com>, Малянов Евгений Викторович
<maljanow@outlook.com> и Сухичев Михаил Иванович <sukhichev@yandex.ru>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 7 января 2023 г. memusage(1)