Как рассчитать использование памяти, как это делает диспетчер задач?
Итак, я использую WMI (.net / C #) для постоянного сбора данных о конкретном процессе, который выполняется на машине. Я получаю данные черезWin32_PerfFormattedData_PerfProc_Process учебный класс. Этот класс имеет много свойств, но нас интересуют следующие:
uint64 PageFileBytes;
Значение в байтах, которое этот процесс использовал в файле (ах) подкачки. В файлах подкачки хранятся страницы памяти, используемые процессом, которые не содержатся в других файлах. Файлы подкачки являются общими для всех процессов, и нехватка места в файлах подкачки может помешать другим процессам выделять память.
uint32 PoolNonpagedBytes;
Значение в байтах в невыгружаемом пуле - область системной памяти (физической памяти, используемой операционной системой) для объектов, которые не могут быть записаны на диск, но должны оставаться в физической памяти, пока они выделены. PoolNonpagedBytes в Win32_PerfFormattedData_PerfOS_Memory вычисляется не так, как свойство PoolPagedBytes в Win32_PerfFormattedData_PerfProc_Process, поэтому он может не совпадать с общим значением PoolPagedBytes для всех экземпляров Win32_PerfForcessf_Proper_Pat Это свойство отображает только последнее наблюдаемое значение; это не в среднем.
uint32 PoolPagedBytes;
Значение в байтах в выгружаемом пуле - область системной памяти (физической памяти, используемой операционной системой) для объектов, которые могут быть записаны на диск, когда они не используются. Свойство PoolNonpagedBytes в Win32_PerfFormattedData_PerfOS_Memory рассчитывается не так, как свойство PoolPagedBytes в Win32_PerfFormattedData_PerfProc_Process, поэтому оно может не совпадать с общим значением PoolPagedBytes для всех экземпляров Win32_PerfForerProc_D Это свойство отображает только последнее наблюдаемое значение; это не в среднем.
uint64 PrivateBytes;
Текущее значение в байтах, выделенное этому процессу, которое нельзя использовать совместно с другими процессами.
uint64 VirtualBytes;
Текущий размер в байтах виртуального адресного пространства, используемого процессом. Использование виртуального адресного пространства не обязательно подразумевает соответствующее использование страниц диска или основной памяти. Виртуальное пространство ограничено, и, используя слишком много, процесс может ограничить свою способность загружать библиотеки.
uint64 WorkingSet;
Максимальное количество в байтах в рабочем наборе этого процесса в любой момент времени. Рабочий набор - это набор страниц памяти, недавно затронутых потоками в процессе. Если объем свободной памяти в компьютере превышает пороговое значение, страницы остаются в рабочем наборе процесса, даже если они не используются. Когда объем свободной памяти падает ниже порогового значения, страницы обрезаются из рабочих наборов. Если они необходимы, они затем мягко возвращаются в рабочий набор перед тем, как покинуть основную память.
В настоящее время я используюWorkingSet
поле для отчета об использовании памяти процессом. Однако это не соответствует тому, что показывает Диспетчер задач. Я пробовал сPrivateBytes
но это тоже не "правильно". Процесс, который отслеживает приложение, представляет собой процесс .NET (если это вообще имеет значение), и приложение сообщает, что оно использует как минимум на 100 МБ больше памяти, чем одновременно показывает диспетчер задач.
Таким образом, вопрос заключается в том, какова «формула» для расчета наилучшего приближения использования памяти процессом, как показано диспетчером задач?