потребление памяти дополнительной программой, как показывает valgrind - PullRequest
2 голосов
/ 21 марта 2011

Моя программа использует много памяти.Вот что мне показывает инструмент массива valgrind:

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 28 38,531,086,036      760,235,208      143,002,822   617,232,386            0

Как видите, дополнительная часть в несколько раз больше, чем полезная куча.

Что я должен сделать, чтобы уменьшить эту дополнительную память?Делать меньше выделений?

Это так называемая фрагментация памяти?

ОС: Linux 2.6.Программа написана на C. Она должна работать 24 \ 7 и манипулировать большим количеством данных.

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Согласно документации , байты "лишней кучи" имеют следующий вид:

Количество дополнительных байтов кучи выделено в этот момент. Это отражает количество байтов, выделенных в превышение того, что просила программа. Есть два источника дополнительной кучи байт.

Во-первых, каждый блок кучи имеет административные байты, связанные с Это. Точное количество административных байт зависит от деталей Распределитель. По умолчанию массив принимает 8 байт на блок, как видно из пример, но этот номер может быть изменено с помощью опции --heap-admin.

Во-вторых, распределители часто округляют количество байтов, запрашиваемых для большего число, как правило, 8 или 16. Это требуется, чтобы элементы в блоке соответственно выровнены. Если запрашивается N байтов, массив округляет N до ближайшего кратного значение, указанное в --alignment опция.

Для меня это не похоже на фрагментацию памяти.

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

Чтобы предотвратить выделение памяти, обычно выделяйте меньше! Используйте пространство стека везде, где это возможно (например, не используйте без необходимости новый), и, если возможно, рассмотрите объединение часто выделяемых объектов, чтобы не продолжать выделять память.

3 голосов
/ 21 марта 2011

Вы выделяете много чрезвычайно маленьких объектов - скажем, всего пару байтов?С каждым выделением связано определенное количество накладных расходов (потому что, например, free должен иметь возможность определить размер блока).

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

Если вы выделяете много очень маленьких объектов, вам следует рассмотреть возможность управленияих отдельно, а не выделять их по отдельности в куче.Это может быть лучше и в других отношениях (например, улучшение локальности памяти), если вы все сделаете правильно.

0 голосов
/ 21 марта 2011

Вы можете сделать меньше выделений большего размера или настроить кучу - последняя будет зависеть от реализации.

Это не фрагментация, просто когда вы запрашиваете, скажем, 7 байтов, куча выделяет не менее 7 байтов - то есть 16 байтов, поэтому 9 байтов становятся «лишними» и фактически теряются.Это делается по разным причинам - например, для поддержания выравнивания.

...