Сколько памяти действительно использует мое приложение Windows?

У меня давно работает экспериментальная программа, занимающаяся памятью, и я хотел бы знать, что это за фактический объем памяти. Диспетчер задач сообщает (в Windows7-64), что приложение потребляет 800 МБ памяти, но общий объем выделенной памяти, также согласно диспетчеру задач, составляет 3,7 ГБ. Сумма всей выделенной памяти не равна 3,7 ГБ. Как я могу на лету определить, сколько памяти на самом деле потребляет мое приложение.

Следствие. О какой памяти на самом деле сообщает диспетчер задач? Кажется, это не вся память, выделенная самому приложению.


person mmr    schedule 22.07.2009    source источник


Ответы (4)


Насколько я понял, Диспетчер задач показывает Рабочий набор;

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

через http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx

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

Я обычно использую perfmon (Пуск -> Выполнить ... -> perfmon) для отслеживания использования памяти с помощью счетчика Private Bytes. Он отражает память, выделенную вашими обычными распределителями (new / HeapAlloc / malloc и т. Д.).

person Kim Gräsman    schedule 22.07.2009
comment
@Kim: Итак, это не лучший способ узнать, сколько памяти выделено конкретному приложению, тогда просто, сколько памяти было затронуто «недавно» для данного значения «недавно» - person mmr; 22.07.2009

Память сложно измерить. Приложение может зарезервировать много виртуальной памяти, но на самом деле не будет использовать ее много. Некоторая часть памяти может использоваться совместно; то есть разделяемая DLL может быть загружена в адресное пространство нескольких приложений, но загружается в физическую память только один раз.

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

Использование виртуальной памяти - это количество виртуальных страниц, которые были зарезервированы (обратите внимание, что не все из них будут фактически зафиксированы, то есть для них выделено физическое резервное хранилище. Вы можете добавить это на дисплей в диспетчере задач, нажав Просмотр -> Выбрать столбцы.

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

person IRBMe    schedule 22.07.2009
comment
В конечном итоге я мог бы использовать профилировщик, но я хочу увидеть, сколько памяти используется, без замедления профилировщика в самом приложении. В конце концов, это будет необходимо, но на тот момент, когда выясняется, сколько памяти фактически потребляется, похоже, что perfmon - правильный инструмент. - person mmr; 23.07.2009

Это зависит от того, о каком воспоминании вы говорите. К сожалению, есть много разных способов измерить память. Например ...

  • Выделенная физическая память
  • Выделенная виртуальная память
  • Виртуальная память зарезервирована (но не зафиксирована)
  • Частные байты
  • Общие байты

Какая метрика вас интересует?

Я думаю, что большинство людей, как правило, интересует категория «Выделенная виртуальная память».

person JaredPar    schedule 22.07.2009
comment
Это потому, что вы обычно не можете контролировать, когда память переключается на диск? Потому что кажется, что физическая память - это то, что вызывает проблемы. Я сам не понимаю этих взаимоотношений ... - person D'Arcy Rittich; 22.07.2009
comment
@OrbMan, насчет первой части я не уверен. Я бы не стал считать существующий API, в котором говорится, пожалуйста, не меняйте местами эту страницу памяти. Но я не знаю ни одного другого. - person JaredPar; 22.07.2009
comment
@JaredPar: меня интересует, какая часть 64-битного адресного пространства была выделена, не обязательно, где эта память была выделена. Например, сколько и насколько велики мои массивы? Совершил ли я какую-то ошибку, не удалив один или два из них, которые, как мне казалось, у меня уже были? - person mmr; 22.07.2009

Статистика памяти, отображаемая диспетчером задач, не является почти всей доступной статистикой и не особенно хорошо представлена. Я бы использовал отличный бесплатный инструмент от Microsoft Sysinternals VMMap, дальнейший анализ памяти, используемой приложением.

Если это длительное приложение, и использование памяти со временем растет, это будет размер кучи. Части кучи могут или не могут быть выгружены на диск в любое время, но вам действительно нужно оптимизировать использование кучи. В этом случае вам необходимо профилировать свое приложение. Если это приложение .Net, я могу порекомендовать профилировщик Redgate ANTS. Это очень простой в использовании. Если это собственное приложение, то профайлер Intel vtune довольно мощный. Вам не нужен исходный код процесса, который вы профилируете для любого инструмента.

Оба приложения имеют бесплатную пробную версию. Удачи.

P.S. Извините, я не добавил больше гиперссылок на инструменты, но это мой первый пост, и stackoverflow ограничивает первые посты одной гиперссылкой :-(

person Community    schedule 22.07.2009