Массив сообщил об использовании кучи гораздо меньше, чем VmRss, что может быть не так?
Вывод массива:
time=3220706
mem_heap_B=393242041
mem_heap_extra_B=73912175
mem_stacks_B=93616
heap_tree=peak
процесс показывает 1,2 ГБ в VmRss, так откуда огромная разница? (Я видел, что Rss растет постоянно).
2 ответа
Функции выделения кучи, такие как malloc, построены поверх этих системных вызовов. Например, когда это необходимо, распределитель обычно вызывает mmap для выделения большого фрагмента памяти, а затем передает части этого фрагмента памяти клиентской программе в ответ на вызовы malloc et al. Massif напрямую измеряет только эти высокоуровневые вызовы malloc и др., А не низкоуровневые системные вызовы.
Нет способа гарантировать размер RSS на основе massif
выход. С --pages-as-heap=yes
вариант, который вы можете оценить VIRT
размер, но это включает в себя все, что было отображено в памяти, не обязательно находится в оперативной памяти.
Вы можете играть с alloc-fn
опция, которая может приблизить вас к оценке реального использования памяти путем ручного указания всех "пользовательских" функций выделения памяти.
Valgrind может использовать значительную память для собственного внутреннего ведения. Таким образом, обычно объем массива отчетов значительно меньше размера процесса, так как размер процесса включает в себя память "клиент / гость" + собственная память valgrind.
Вы можете использовать опцию valgrind --stats=yes, чтобы получить больше информации о памяти, используемой клиентом, по сравнению с памятью, используемой valgrind.