2015-06-11 4 views
2

Это вопрос системы Linux, а не вопрос кодирования. Когда я использую «верх» для проверки использования моей программы в памяти, она сообщает значение в 3-4 раза больше, чем фактическое распределение кучи, заданное Valgrind's Massif, профилировщиком памяти. Это большая программа, и разница составляет сотни мегабайт. Руководство Valgrind дает лишь частичное объяснение:Сколько памяти Linux дал malloc()?

(массив) не непосредственно измерения памяти, выделенной с системы более низкого уровня вызовов, как ттар, mremap и БРК.

Функции распределения кучи, такие как malloc, построены поверх этих системных вызовов . Например, при необходимости распределитель обычно будет вызывать mmap для выделения большого фрагмента памяти, а затем передать фрагментов этого фрагмента памяти в клиентскую программу в ответ на вызовы в malloc et al. Massif напрямую измеряет только эти вызовы более высокого уровня malloc и др., А не системные вызовы более низкого уровня.

Хорошо, но сколько памяти я действительно забираю из системы? Мне нужно иметь возможность запускать как можно больше экземпляров этой программы на одной машине, поэтому мне нужно знать, какая часть этой памяти по-прежнему доступна. Выравнивание страниц и т. Д. Не может объяснить разницу в сотнях мегабайт в используемой памяти.

Кроме того, что определяет размер блока лежащего в основе вызова mmap()? Я вижу блоки с 64 МБ в то время, когда их берут по вершине, которые кажутся странно большими.

+0

Существует различие между распределением виртуальной памяти и использованием физической памяти. В верхней части Linux они отображаются как VIRT и RES. Используйте 'pmap -X [pid]' для большого количества деталей памяти. Я сомневаюсь, что эти 64-мегабайтные блоки памяти фактически используются. Вероятно, это виртуальные оговорки. –

+0

Стоит отметить, что всякий раз, когда вы запускаете программу под valgrind или asan, она выделяет много памяти в детском пространстве для своих собственных структур. – o11c

ответ

1

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

Например, вы найдете реализации malloc, в которых используется блок памяти размером до 1024 mallocs размером до 16 байт, еще один блок размером до 1024 mallocs до 32 байт и т. Д. С несколькими mallocs это неэффективно, но все же дешево. С gazillions mallocs это делает malloc очень эффективным.

Так что «в 4 раза больше» может быть совершенно бессмысленным. Расскажите, сколько мегабайт больше, чем вы думали.