Как показать процент использования памяти в процессе win32? - PullRequest
2 голосов
/ 24 марта 2010

Я знаю, что использование памяти - очень сложная проблема в Windows.

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

Одна реализация использовала ullAvailVirtual из MEMORYSTATUSEX в качестве базы, затем использовала HeapWalk () для обхода кучи процесса в поисках дополнительной свободной памяти. Шаг HeapWalk () был необходим, потому что мы заметили, что через некоторое время работы память, выделенная и освобожденная кучей, никогда не возвращалась и сообщалась по номеру ullAvailVirtual. После нескольких часов интенсивной работы номер ullAvailVirtual больше не будет точно отображать объем доступной памяти.

Однако этот метод оказался не идеальным из-за случайных нечетных ошибок, которые возвращал HeapWalk (), даже когда куча процесса не была повреждена. Кроме того, поскольку это элемент управления пользовательского интерфейса, код обхода кучи выполнялся каждые 5-10 секунд. Я пытался связаться с Microsoft по поводу того, почему HeapWalk () не удался, обострил дело через MSDN, но так и не получил ответа, кроме «вы, вероятно, не должны этого делать».

Итак, в качестве второй реализации я использовал PagefileUsage из PROCESS_MEMORY_COUNTERS в качестве базы. Затем я использовал VirtualQueryEx для обхода виртуального адресного пространства, складывая все регионы, которые не были MEM_FREE, и возвращал значение для GetMappedFileNameA (). Я думал, что PageFileUsage по сути является «частными байтами», поэтому, если я добавлю к этому значению общий размер библиотек DLL, которые использовал мой процесс, это было бы хорошим приближением к объему памяти, которую использовал мой процесс.

Похоже, что этот второй метод (вроде) работает, по крайней мере он не вызывает сбои, как метод кучи. Однако, когда оба метода включены, значения не совпадают. Так что один из методов неправильный.

Итак, мир StackOverflow ... как бы вы это реализовали?

  • какой метод более перспективен, или у вас есть третий, лучший метод?
  • Должен ли я вернуться к исходному методу и продолжить отладку нечетных ошибок?
  • я должен держаться подальше от ходьбы кучи каждые 5-10 секунд?

Имейте в виду, что весь смысл в том, чтобы указать пользователю, что он становится «опасным», и ему следует либо освободить память, либо перезапустить приложение. Возможно, «использованный процент» не лучшее решение этой проблемы? Что такое? У меня была еще одна идея - система, основанная на цвете (красная, желтая, зеленая, в которой я мог бы использовать больше факторов, чем одно число)

Ответы [ 3 ]

1 голос
/ 24 марта 2010

Да, диспетчер памяти Windows был оптимизирован для максимально быстрого и эффективного выполнения запросов к памяти, он был , а не , оптимизированный для простого измерения объема используемого пространства. Первым недостатком является то, что освобождаемые блоки кучи редко отображаются. Они просто помечаются как «свободные» для использования при следующем распределении. Вот почему VirtualQueryEx () не может работать.

Проблема с HeapWalk заключается в том, что вам нужно заблокировать кучу (HeapLock), чтобы он мог обходить ее без изменения распределения кучи. Этот замок может иметь очень вредные побочные эффекты. Цитирование:

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

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

0 голосов
/ 24 марта 2010

Место для начала, вероятно, GetProcessMemoryInfo () . Это заполняет структуру для вас, которая, помимо прочего, имеет текущий рабочий набор в байтах.

0 голосов
/ 24 марта 2010

Взгляните на следующую статью .NET и запущенные процессы

Он использует WMI для проверки использования памяти процессами, в частности, с использованием

System.Diagnostics.Process

и еще одна ссылка о том, как использовать WMI в C #: WMI Made Easy для C #

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...