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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Таким образом, отношения:

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

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

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

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

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

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

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

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

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

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

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

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


    Чтобы дать вам намек на проблему с описаниями счетчиков perfmon, вот внутренняя история о частных байтах из « Private Bytes Performance Counter – Beware! » На MSDN:

    Q: Когда это частный байт, а не частный байт?

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

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


    Из « Планирования производительности » в 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); 

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

    Interesting Posts

    Изображение в оттенках серого с помощью CSS и повторного цвета при наведении мыши?

    Добавление дней к дате в Java

    Создание формы треугольника с использованием определений xml?

    Как анализировать «запуск из спящего режима»

    ВСЕГДА отображает последний / стандартный пользовательский экран приветствия Windows 7

    Как иметь выпадающее поле в форме рельсов?

    Лучше ли использовать аргументы void void foo (void) “или нет” void foo () “?

    Кто-нибудь имел успех с Visual Studio 6 в Windows 7?

    Запись сезона AVI на DVD-плеер без DivX

    Что такое простое английское объяснение «Big O»?

    Android: BitmapFactory.decodeStream () из памяти с файлом 400 КБ с бесплатной кучей 2 МБ

    Каким образом исключения C ++ замедляют работу кода, если нет исключений?

    Есть ли способ разделить окно / вкладку одного браузера на 2 области просмотра?

    Как преобразовать многостраничный файл в файл?

    Как изменить цвет изображения растрового изображения в Android?

    Давайте будем гением компьютера.