Как измерить общее использование ОЗУ в программе под Windows?

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

Смотрите скриншот из Sysinternals Process Explorer ниже:

Одна программа открывает несколько процессов

Например, Firefox открывается только в одном процессе, а Google Chrome запускает несколько процессов для каждой вкладки.

Итак, как я могу получить общее использование ОЗУ для всех процессов, открытых одной программой? (Например, для Google Chrome.)

Конечно, я мог бы просто использовать калькулятор и подсчитать сумму … но должен быть более удобный способ!

  • Windows 10: Отсутствует boot.wim?
  • Использовать более поздний кадр для миниатюры видео в Windows 7
  • Невозможно изменить размер формы компонента в MS Visio 2007
  • Как установить программу по умолчанию для открытия файлов без расширения в Windows?
  • Копирование `/ Users` в Windows 8 поверх другой установки Windows 8 для сохранения настроек?
  • Часы Windows, показывающие как UTC, так и местное время?
  • Две установки Windows 8 на отдельных жестких дисках - невозможность загрузки
  • Отключить Tabbing в Firefox 3, Chrome 4 и IE8?
  • 3 Solutions collect form web for “Как измерить общее использование ОЗУ в программе под Windows?”

    Общий ответ: вы не можете, не точно.

    Предполагая, что вы спрашиваете об ОЗУ (физической памяти), а не виртуальном – Windows публикует два соответствующих счетчика для каждого процесса, общий рабочий набор и частный (для процесса) рабочий набор. (PerfMon покажет вам их.) Диспетчер задач показывает «частные» и «общие» (добавленные вместе они дадут общее количество). Process Explorer показывает их как «Рабочий набор» (общий), «Частный» WS, «Совместное использование WS» и «WS Shared». ProcExp делает немного «глубокого рытья», чтобы найти последние два.

    Эти проблемы являются причиной «общей» или общей части общей суммы.

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

    Беда в том, что вы не знаете, сколько или какие процессы фактически делят его. Добавление всех «разделяемых» или «общих» чисел даст вам больше, чем реальность, потому что общие страницы будут учитываться во всех процессах, которые могут быть использованы для их обмена. Не каждый процесс, даже процессы, выполняющие одну и ту же программу (например, Chrome), обязательно будут совместно использовать одни и те же страницы из общего адресного пространства.

    Для набора процессов все работает с тем же .exe, как и у Chrome: объединив все свои счетчики «WS Private», а затем добавив к этому самому большому из всех «WS-совместимых» экземпляров экземпляра Chrome, вы доберетесь до минимума Цифра … но фактическое может быть больше.

    У Chrome есть эта замечательная функция самоотчета, упомянутая ge0rdi. Счетчики, которые вы хотите, – это те, что находятся в разделе «Память». Chrome на моей машине не согласуется точно с тем, что сообщает ОС, но оно достаточно близко для всех практических применений.

    Еще одна вещь, которую следует учитывать, заключается в том, что «использование памяти» любого процесса или подмножества процессов в операционной системе виртуальной памяти чрезвычайно зависит от поведения процесса и давления в RAM. Запустите его в системе с более или менее оперативной памятью или с более или менее другими работами и требующими RAM, и цифры будут выглядеть совсем по-другому. Таким образом, не существует фиксированного числа в отношении того, сколько оперативной памяти требуется любому процессу. Поэтому даже «обратите внимание на имеющуюся оперативную память, затем закройте все экземпляры Chrome и посмотрите, сколько доступно количество оперативной памяти» не является хорошим тестом. ОС может назначить часть выпущенного ОЗУ другим процессам, особенно если они заняты.

    Я не знаю, как это сделать в целом, но для измерения общего использования памяти Chrome вы можете написать about://memory в адресной строке.

    В разделе « Summary » показано общее использование памяти всех процессов Chrome.

    Некоторое время назад я написал отличный (и, возможно, несколько уродливый) пакетный файл, который делает это, он требует sed и cut gnuwin32.

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

    В настоящее время я пытаюсь ее аккуратно, но это все так, как есть.

    Итак, он говорит, что Chrome использует 3,4 ГБ

      C:\>ramchrome<ENTER> >=1GB 3GB 3,480,288 3.4GB (rounded down) 3480288KB 

    Вот командный файл. В свое время это было намного проще. Но я хотел добавить, например, GB и KB .. и это занимает большую часть командного файла. Это очень перспективное доказательство, потому что даже если Chrome занял кучу yottabytes (yottabyte – миллион триллионов мегабайт), тогда моя партия должна или, по крайней мере, написана, чтобы поддержать это.

    Основа того, как работает внутренняя часть командного файла, проста: она создает некоторые временные файлы, на которые вы можете смотреть. Вы видите, что в основном выводит список всех процессов, отфильтровывает те, которые используются для chrome.exe. Просто часть, в которой указано, сколько байтов оно использует. Затем последний файл temp, который вы можете выводить, показывает, что он содержит список всех байтов, используемых каждым процессом chrome.exe, с любыми удаленными запятыми или пробелами, а затем оператор for суммирует их все. Последний файл temp можно открыть в excel .. хотя нет необходимости.

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

     @echo off setlocal enableextensions enabledelayedexpansion set tempfile1=%temp%\asdf1.a set tempfile2=%temp%\asdf2.a set tempfile3=%temp%\asdf3.a set tempfile4=%temp%\asdf4.xls tasklist >%tempfile1% type %tempfile1% | grep "chrome" > %tempfile2% cut -b 68- %tempfile2% > %tempfile3% sed -r "s/\d32|K|,//g" %tempfile3% >%tempfile4% set total=0 for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul :: --- added this set a=%total% if "%a:~-9,-6%"=="" echo ^< 1GB if NOT "%a:~-13,-6%"=="" echo ^>=1GB set yotta=%a:~-24,-21% set zetta=%a:~-21,-18% set exa=%a:~-18,-15% set peta=%a:~-15,-12% set tera=%a:~-12,-9% set giga=%a:~-9,-6% set mega=%a:~-6,-3% set kilo=%a:~-3% set prefix= if NOT "!yotta!"=="" ( set yotta=!yotta!, if "!prefix!"=="" ( set prefix=YB echo !a:~-24,-21!!prefix! ) ) if NOT "!zetta!"=="" ( set zetta=!zetta!, if "!prefix!"=="" ( set prefix=ZB echo !a:~-21,-18!!prefix! ) ) if NOT "!exa!"=="" ( set exa=!exa!, if "!prefix!"=="" ( set prefix=EB echo !a:~-18,-15!!prefix! ) ) if NOT "!peta!"=="" ( set peta=!peta!, if "!prefix!"=="" ( set prefix=PB echo !a:~-15,-12!!prefix! ) ) if NOT "!tera!"=="" ( set tera=!tera!, if "!prefix!"=="" ( set prefix=TB echo !a:~-12,-9!!prefix! ) ) if NOT "!giga!"=="" ( set giga=!giga!, if "!prefix!"=="" ( set prefix=GB echo !a:~-9,-6!!prefix! ) ) if NOT "!mega!"=="" ( set mega=!mega!, if "!prefix!"=="" ( set prefix=MB echo !a:~-6,-3!!prefix! ) ) if "!mega!"=="" ( if "!prefix!"=="" ( set prefix=KB echo !kilo! ) ) echo !yotta!!zetta!!exa!!peta!!tera!!giga!!mega!!kilo! if "%prefix%"=="YB" echo !a:~-24,-21!.!a:~-21!YB (rounded down) if "%prefix%"=="TB" echo !a:~-12,-9!.!a:~-9,1!TB (rounded down) if "%prefix%"=="GB" echo !a:~-9,-6!.!a:~-6,1!GB (rounded down) if "%prefix%"=="MB" echo !a:~-6,-3!.!a:~-3,1!MB (rounded down) :: echo %a:~-13,-6%,%a:~-6,-3%,%a:~-3% set a= :: ----------- echo %total%KB set tempfile1= set tempfile2= set tempfile3= set tempfile4= 

    Чтобы обобщить, как это работает, вот пример первого временного файла asdf1.a, поскольку вы можете видеть, что он перечисляет многие процессы, а не только chrome.exe

     chrome.exe 5572 Console 1 64,784 K chrome.exe 3880 Console 1 155,376 K chrome.exe 14516 Console 1 106,932 K chrome.exe 2524 Console 1 88,464 K dllhost.exe 15996 Console 1 8,844 K tasklist.exe 16232 Console 1 7,152 K 

    Второй временный файл приближается к тому, что мы хотим, отфильтровывая chrome.exe

    asdf2.a

     chrome.exe 5572 Console 1 64,784 K chrome.exe 3880 Console 1 155,376 K chrome.exe 14516 Console 1 106,932 K chrome.exe 2524 Console 1 88,464 K 

    Asdf3.a становится все ближе

      64,784 K 155,376 K 106,932 K 88,464 K 

    Asdf4.xml (не спрашивайте, почему это .xls, возможно, я намеревался открыть его в excel)

     64796 155592 114084 88464 

    Итак, вы, командный файл, создали простой список для суммирования.

    И, очевидно, эта строка командного файла суммирует

     for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul 

    Примечание. Использование командного файла для записи было глупым. Пакетные файлы часто не очень переносимы, поскольку небольшое изменение в выходе команды с новой версией ОС или новой версией команды может сделать программу неработоспособной , И если он полагается на сторонние программы, где разные версии их там, то это не хорошо. И многие команды gnuwin32 устарели, cygwin имеет тенденцию быть более актуальным с его версиями команд. Это работало отлично для меня, хотя теперь я попробовал, он дал ошибку.

    В какой-то момент я мог бы написать что-то на C #.

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

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