Что такое частные байты, виртуальные байты, рабочий набор?

Я пытаюсь использовать утилиту perfmon windows для отладки утечек памяти в процессе.

вот как perfmon объясняет термины:

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

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

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

вот вопросы, которые у меня есть:

это частные байты, которые я должен измерить, чтобы быть уверенным, что процесс имеет какие-либо утечки, поскольку он не включает никаких общих библиотек, и любые утечки, если это произойдет, будут исходить из самого процесса?

что такое общая память, потребляемая процессом? Это виртуальные байты или сумма виртуальных байтов и рабочего набора?

существует ли какая-либо связь между частными байтами, рабочим набором и виртуальными байтами?

есть ли другие инструменты, которые дают лучшее представление об использовании памяти?

4 ответов


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

Байт см. объем памяти, который имеет исполняемый файл процесса попросил - не обязательно сумма на самом деле, используя. Они являются "частными", потому что они (обычно) исключить сопоставленные с памятью файлы (т. е. общие библиотеки DLL). Но-вот в чем загвоздка-они не обязательно исключают память выделены те файлы. Невозможно определить, произошло ли изменение в частных байтах из-за самого исполняемого файла или из-за связанной библиотеки. Частные байты также не исключительно физическая память; они могут быть выгружены на диск или в списке резервных страниц (т. е. больше не используются, но еще не выгружены).

Рабочий Набор относится всего физическая Память (ОЗУ), используемая процессом. Однако, в отличие от частных байтов, это также включает сопоставленные с памятью файлы и различные другие ресурсы, поэтому это еще менее точное измерение, чем частные байты. Это то же самое значение, которое сообщается в "использовании Mem" Диспетчера задач и было источником бесконечного количества путаницы в последние годы. Память в рабочем наборе является "физической" в том смысле, что она может быть решена без ошибки страницы; однако список резервных страниц и все еще физически в памяти, но не сообщается в рабочем наборе, и именно поэтому вы можете увидеть, что "использование Mem" внезапно падает, когда вы минимизируете приложение.

Виртуальный Байт полное виртуальное адресное пространство занято всем процессом. Это похоже на рабочий набор в том смысле, что он включает сопоставленные с памятью файлы (общие библиотеки DLL), но также включает данные в список ожидания и данные, которые уже был выгружен и сидит в файле подкачки на диске где-то. Общий объем виртуальных байтов, используемых каждым процессом в системе под большой нагрузкой, составит значительно больше памяти, чем у машины.

поэтому отношения:

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

здесь есть еще одна проблема; так же, как общие библиотеки могут выделять память внутри вашего модуля приложения, что приводит к потенциальным ложным срабатываниям, сообщаемым в личных байтах вашего приложения,код приложение также может в конечном итоге выделять память внутри shared модули, ведущие к false минусы. Это означает, что у вашего приложения действительно может быть утечка памяти это никогда не проявляется в частных байтах вообще. Маловероятно, но возможно.

частная байт разумный приближение объема памяти, который использует ваш исполняемый файл, и может быть использован для помощи сузить список потенциальных кандидатов на утечку памяти; если вы видите, что число растет и растет постоянно и бесконечно, вы хотели бы проверить этот процесс на утечку. Однако это невозможно!--7-->доказать что есть или не утечка.

один из самых эффективных инструментов для обнаружения и исправления утечек памяти в Windows фактически Visual Studio (ссылка переходит на страницу использования VS для утечек памяти, а не на страницу продукта). Рациональное Очистить это еще одна возможность. Microsoft также имеет более общий документ о передовой практике на эту тему. Есть больше инструментов, перечисленных в этом предыдущий вопрос.

надеюсь, это прояснит несколько вещей вверх! Отслеживание утечек памяти-одна из самых сложных задач при отладке. Удача.


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

предыдущий ответ на этот вопрос дал отличное объяснение того, что различные типы.

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

http://www.softwareverify.com/cpp/memory/index.html

отказ от ответственности: я разработал валидатор памяти.


определение счетчиков perfmon было нарушено с самого начала и по какой-то причине кажется слишком сложным для исправления.

хороший обзор управления памятью Windows доступен в видео"раскрыты тайны управления памятью " на MSDN: он охватывает больше тем, чем необходимо для отслеживания утечек памяти (например, управление рабочим набором), но дает достаточно подробную информацию в соответствующих темах.


чтобы дать вам намек проблема с описаниями счетчиков perfmon, вот внутренняя история о частных байтах из"Счетчик Производительности Частных Байтов -- Остерегайтесь! " на MSDN:

Q: когда частный байт не является частным байтом?

A: когда он не является резидентом.

счетчик частных байтов сообщает о зарядке фиксации процесса. То есть, объем пространства, который был выделен в файле подкачки для хранения содержимого частной памяти в том случае, если она будет заменена. Примечание: Я избегаю слова "зарезервировано" из-за возможной путаницы с виртуальной памятью в зарезервированном состоянии, которое не зафиксировано.


от "Планирование " на MSDN:

3.3 Частная Байт

3.3.1 описание

частная память, определяется как память, выделенная для процесса, который не может быть совместно с другими процессами. Эта память дороже, чем общая память, когда на компьютере выполняется несколько таких процессов. Частная память в (традиционных) неуправляемых библиотеках DLL обычно состоит из статики C++ и составляет порядка 5% от общего рабочего набора dll.


здесь есть интересная дискуссия: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Мое понимание этого потока заключается в том, что освобождение небольших выделений не отражается в частных байтах или рабочем наборе.

короче:

Если я называю

p=malloc(1000);
free(p);

тогда частные байты отражают только распределение, а не освобождение.

Если я звоните

p=malloc(>512k);
free(p);

тогда частные байты правильно отражают распределение и освобождение.