Ответ 1
Использовать профилировщик valgrind heap: Massif
Как найти размер памяти кучи С++-программы под платформой linux? Мне нужно пространство памяти кучи перед использованием нового или malloc, а также после этого. Кто-нибудь может помочь?
#include <malloc.h>
#include <iostream>
int main()
{
//here need heap memory space
unsigned char* I2C_Read_Data= new unsigned char[250];
//get heap memory space After the usage of new
return 0;
}
Использовать профилировщик valgrind heap: Massif
Вы также можете добавить отслеживание кучи в свои собственные программы, перегружая операторы new
и delete
. В игровой движок Я работаю над этим, у меня все распределение памяти происходит через специальные функции, которые привязывают каждое выделение к определенному объекту отслеживания кучи. Таким образом, в любой момент я могу поднять отчет и посмотреть, сколько памяти заняты сущностями, актерами, сценариями Lua и т.д.
Это не так тщательно, как использование внешнего профилировщика (особенно, когда внешние библиотеки обрабатывают собственное управление памятью), но очень приятно видеть, в какой именно памяти вы были ответственны.
Вы можете использовать вызов функции getrlimit и передать RLIMIT_DATA
для ресурса. Это должно дать вам размер сегмента данных для вашей программы.
В Linux вы можете прочитать /proc/[pid]/statm
, чтобы получить информацию об использовании памяти.
Предоставляет информацию об использовании памяти, измеренную на страницах. столбцы:
size total program size (same as VmSize in /proc/[pid]/status) resident resident set size (same as VmRSS in /proc/[pid]/status) share shared pages (from shared mappings) text text (code) lib library (unused in Linux 2.6) data data + stack dt dirty pages (unused in Linux 2.6)
Подробнее см. справочная страница.
Ответа на этот вопрос Adam Zalcman на question описывает некоторые интересные подробности распределения кучи
Помимо внешнего контроля, вы также можете задействовать свою реализацию malloc, чтобы вы могли проверить эти статистические данные. jemalloc
и tcmalloc
являются реализациями, которые вместо выполнения лучше для многопоточного кода, типичных реализаций libc, добавляют некоторые служебные функции такого типа.
Чтобы копать глубже, вы должны немного узнать, как работает распределение кучи. В конечном счете, ОС - это тот, который назначает память процессам по мере их запроса, однако запросы к ОС (syscalls) медленнее, чем обычные вызовы, поэтому в целом реализация malloc
будет запрашивать большие куски ОС (4 КБ или 8KB-блоки являются общими), и подразделяйте их, чтобы обслуживать их для своих абонентов.
Вам нужно определить, интересует ли вас общая память, потребляемая процессом (включая сам код), память, запрошенная процессом из ОС в рамках конкретного вызова процедуры, память, которая фактически используется malloc
реализация (которая добавляет свои собственные накладные расходы на хранение, хотя и небольшую), или запрошенную память.
Кроме того, фрагментация может быть болью для последних двух и может несколько размыть различия между действительно используемыми и назначенными.
Вы можете попробовать "mallinfo" и "malloc_info". Они могут работать. У mallinfo возникают проблемы при распределении более 2 ГБ. malloc_info - это особая особенность, особенно очень странная. Я согласен - очень часто приятно делать это без сторонних инструментов.