Как измерить общее использование оперативной памяти программы под Windows?

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

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

One programm opens several processes

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

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

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

15
задан Mat
09.04.2023 5:14 Количество просмотров материала 3641
Распечатать страницу

3 ответа

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

предполагая, что вы спрашиваете о оперативной памяти (физической памяти), а не виртуальной - Windows публикует два соответствующих счетчика для каждого процесса, общий рабочий набор и частный (для процесса) рабочий набор. (PerfMon покажет вам это.) Диспетчер задач показывает "частные" и "общие" (вместе они дадут общее). Процесс Эксплорер показывает их как "рабочий набор" (общая), "с WS частная", "нам совместно", и "нам Общий." ProcExp делает немного "глубокого рытья", чтобы найти последние два.

" общий", или общая часть общего, являются причиной проблем.

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

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

для набора процессов, выполняющихся одинаково .exe, как Chrome: путем сложения всех их как "WS частная" счетчики, а затем добавить к общей величине примеру в Chrome "нам совместно", вы получите на минимальный показатель... но фактически может быть больше.

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

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

12
отвечен Jamie Hanrahan 2023-04-10 13:02

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

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

10
отвечен ge0rdi 2023-04-10 15:19

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

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

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

Итак, он говорит, что Chrome использует 3.4 GB

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

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

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

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

@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 файл.как вы можете видеть в нем перечислены многие процессы не только хром.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.а еще ближе еще

 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, используемые программой. Хотя лично я считаю, что мне полезно знать, сколько используется исполняемым файлом (или в случае некоторых современных браузеры, множество экземпляров исполняемого файла!)

0
отвечен barlop 2023-04-10 17:36

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх