как получить размер кучи программы - PullRequest
12 голосов
/ 17 марта 2012

Как найти размер кучи памяти для программы на c ++ на платформе Linux? Мне нужно пространство кучи перед использованием new или malloc, а также после этого. Кто-нибудь может помочь?

Ответы [ 6 ]

5 голосов
/ 17 марта 2012

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

sample of my memory tables

5 голосов
/ 17 марта 2012

Используйте профилировщик кучи Вальгринда: Массив

2 голосов
/ 18 марта 2012

В 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)

Подробнее см. Справочную страницу .

Ответ Адама Зальцмана на этот вопрос некоторые интересные детали выделения кучи

1 голос
/ 17 марта 2012

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

0 голосов
/ 26 марта 2015

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

0 голосов
/ 17 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...