Вопрос

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

--------------------------------------------------------------------------------
  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, и она манипулирует многими данными.

Это было полезно?

Решение

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

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

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

Другие советы

Согласно документация, байты "Extra-Heap" следующие:

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top