Как приложение C ++ может использовать больше кучи, чем память RSS? - PullRequest
1 голос
/ 27 марта 2019

У меня есть исполняемый файл C ++ для многопоточного приложения, которое предполагает открытие портов UDP.

Я измеряю использование памяти этим приложением, используя различные инструменты.

Из моего понимания использования памяти Linux RSS = Heap + Stack + Shared + CodeSize.

Однако теперь я думаю, что уравнение неверно, потому что мое приложение имеет:

  • Пиковое использование кучи: 40Mb
  • Пик RSS: 30Mb

Я измерил числа различными инструментами (valgrind, heaptrack, top ..), чтобы я мог сказать, что они правильные.

Как это возможно? Каковы причины и последствия этой ситуации?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

RSS - это Резидент Заданный размер.

Не вся куча обязательно является резидентной - ее можно заменить, например.

Однако Виртуальное использование памяти будет включать в себя всю кучу (как резидентную, так и нерезидентную части).

0 голосов
/ 10 апреля 2019

Как отметил @ user4581301 в комментариях, в моей идее RSS возникла проблема.

HEAP = DynamicMemoryAllocated

RSS = DynamicMemoryInitialized + Stack + Shared + CodeSize

Так что это не такЗначение true, что весь размер кучи содержится в RSS, но только та его часть, которая была инициализирована.

Если вы выделите место для массива 10 МБ, это HEAP.Если вы начнете инициализировать его, то инициализированные части будут считаться RSS.

...