it-swarm.com.ru

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

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

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

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

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

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

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

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

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

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

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

442
pankajt

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

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

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

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

Итак, отношения:

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

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

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

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

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

465
Aaronaught

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

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

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

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

Отказ от ответственности: я разработал Memory Validator.

9
Stephen Kellett

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

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


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

В: Когда личный байт не является личным?

A: Когда это не резидент.

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


Из " Планирование производительности " в MSDN:

3.3 Частные байты

3.3.1 Описание

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

8
Mark

Здесь есть интересная дискуссия: 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);

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

5
mcanti