Как получить размер кучи программы

Как найти размер памяти кучи С++-программы под платформой 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;
 }

Ответ 1

Использовать профилировщик valgrind heap: Massif

Ответ 2

Вы также можете добавить отслеживание кучи в свои собственные программы, перегружая операторы new и delete. В игровой движок Я работаю над этим, у меня все распределение памяти происходит через специальные функции, которые привязывают каждое выделение к определенному объекту отслеживания кучи. Таким образом, в любой момент я могу поднять отчет и посмотреть, сколько памяти заняты сущностями, актерами, сценариями Lua и т.д.

Это не так тщательно, как использование внешнего профилировщика (особенно, когда внешние библиотеки обрабатывают собственное управление памятью), но очень приятно видеть, в какой именно памяти вы были ответственны.

sample of my memory tables

Ответ 3

Вы можете использовать вызов функции getrlimit и передать RLIMIT_DATA для ресурса. Это должно дать вам размер сегмента данных для вашей программы.

Ответ 4

В 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 описывает некоторые интересные подробности распределения кучи

Ответ 5

Помимо внешнего контроля, вы также можете задействовать свою реализацию malloc, чтобы вы могли проверить эти статистические данные. jemalloc и tcmalloc являются реализациями, которые вместо выполнения лучше для многопоточного кода, типичных реализаций libc, добавляют некоторые служебные функции такого типа.

Чтобы копать глубже, вы должны немного узнать, как работает распределение кучи. В конечном счете, ОС - это тот, который назначает память процессам по мере их запроса, однако запросы к ОС (syscalls) медленнее, чем обычные вызовы, поэтому в целом реализация malloc будет запрашивать большие куски ОС (4 КБ или 8KB-блоки являются общими), и подразделяйте их, чтобы обслуживать их для своих абонентов.

Вам нужно определить, интересует ли вас общая память, потребляемая процессом (включая сам код), память, запрошенная процессом из ОС в рамках конкретного вызова процедуры, память, которая фактически используется malloc реализация (которая добавляет свои собственные накладные расходы на хранение, хотя и небольшую), или запрошенную память.

Кроме того, фрагментация может быть болью для последних двух и может несколько размыть различия между действительно используемыми и назначенными.

Ответ 6

Вы можете попробовать "mallinfo" и "malloc_info". Они могут работать. У mallinfo возникают проблемы при распределении более 2 ГБ. malloc_info - это особая особенность, особенно очень странная. Я согласен - очень часто приятно делать это без сторонних инструментов.