Как определить, какой процесс зафиксировал память

747
Dunken

В моей системе слишком много памяти (из 8 ГБ ОЗУ и 2 ГБ файла подкачки 85% памяти выделено). Физическое использование составляет около 65%.

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

enter image description here

enter image description here

2
Итак, вы хотите знать, что использует всю вашу физическую память или что использует всю вашу виртуальную память (физическую + страничную) или что-то еще? BeowulfNode42 5 лет назад 0
Я хочу знать, что отвечает за большой объем коммитов в моей системе (объем виртуальной памяти, гарантированный всем процессам). Dunken 5 лет назад 0

2 ответа на вопрос

3
Pimp Juice IT

Решение PowerShell

1. Получите топ-10 процессов, использующих наибольшее количество виртуальной памяти

Get-Process | Sort PagedMemorySize-Desc | Select Name, PagedMemorySize, VirtualMemorySize -First 10 

Пример вывода

Name VirtualMemorySize PagedMemorySize ---- ----------------- --------------- UrBackupClientBackend 685735936 548347904 explorer 1529909248 478908416 Microsoft.Photos 1303465984 433094656 MBAMService 661987328 228876288 MicrosoftEdgeCP 894496768 219799552 MsMpEng 667783168 205774848 MicrosoftEdgeCP 874590208 202584064 mstsc 440627200 185860096 javaw 886177792 185556992 MicrosoftEdgeCP 802746368 146792448 

2. Получить сумму всей выделенной виртуальной памяти

Get-WmiObject win32_operatingsystem | Select @} 

Пример вывода

commit ------ 4.56205749511719 

Вспомогательные ресурсы

@Dunken Run `Get-Process | Выберите * -First 10`, чтобы увидеть все свойства, которые вы можете получить явно или что угодно, если это необходимо. Pimp Juice IT 5 лет назад 0
Process.VirtualMemorySize - это общее количество определенных процессов. Он включает в себя сопоставленные и даже зарезервированные vas. Это намного больше, чем вклад процесса в фиксацию заряда. Jamie Hanrahan 5 лет назад 0
@JamieHanrahan Ответ обновлен, чтобы сделать его более понятным и с дополнительными пояснениями .... Давайте сделаем снимок с помощью свойства Process.PrivateMemorySize, добавленного в команду PowerShell, как уже упоминалось. Вы можете добавить `PeakPagedMemorySize` в оператор select, чтобы увидеть, насколько больше выделено виртуальное запоминающее устройство для каждого процесса, а также для принятия. Pimp Juice IT 5 лет назад 1
Как указывает Jamie VirtualMemorySize, похоже, здесь не помогает (слишком большой). Paged / PrivateMemorySize64 выглядит как «Private Bytes» (или закрывается), но намного меньше, чем то, что я получаю в VMMap как «Committed» ... PeakPagedMemorySize64 лучше, но все еще далеко от того, что я вижу в VMMap: например, PPMS64 560MB против Совершено Всего 954MB Dunken 5 лет назад 0
1
Jamie Hanrahan

В списке процессов Process Explorer столбец «Private Bytes» отображает вклад каждого процесса в фиксацию. Нет необходимости смотреть на нижнюю панель.

Обязательно запустите Process Explorer от имени администратора.

Диспетчер задач отображает ту же информацию на вкладке Сведения в столбце «Размер коммита».

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

В соответствии с внутренними документами Windows, вкладчики в общую плату за принятие решений:

  • частное участие в каждом процессе
  • Сопоставленный с файлом подкачки подкачки (не отображается в «частных байтах» процесса)
  • области копирования при записи сопоставленных полей
  • Не выгружаемый и выгружаемый пул
  • другие выделения пространства ядра, явно не поддерживаемые файлами (например, код для постраничного вывода в драйверах или в ntoskrnl.exe не учитывается, так как он поддерживается соответствующими исполняемыми файлами)
  • Ядра стеков - каждый поток имеет один
  • Таблицы страниц
  • Пространство для таблиц страниц еще не выделено, но для которых уже существует выделенный vas
  • «Расширение оконного адреса» (AWE)

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

Хм ... Я не думаю, что "Private Bytes" (в ProcExp) или "Commit size" (в TskMgr) показывает всю выделенную, зарезервированную память. Если я проверяю в VMMap, я получаю более высокие числа. Поэтому я считаю, что PrivateBytes / CommitSize является лишь частью общего ... Dunken 5 лет назад 0
Вы правы: «Частные байты» (в ProcExp) или «Размер фиксации» (в TskMgr) не включают зарезервированное виртуальное адресное пространство. Но _reserved_ vas не является _committed_ памятью и не учитывается при фиксации заряда. Вы спросили, как найти, какие процессы внесли свой вклад в выделенную память - как вы это делаете - счетчики, которые я привел (на самом деле это один и тот же счетчик с разными именами). (Они включают разделы на основе файла подкачки.) VMmap включает зарезервированные vas, а также vas, сопоставленные с файлами, отличными от файла подкачки. Они не способствуют совершению обвинения, поэтому вам не нужно беспокоиться о них. Jamie Hanrahan 5 лет назад 0
Извините, я ищу выделенную память: если я вас правильно понимаю, вы говорите, что Sum (Private Bytes) равна общему объему выделенной памяти. Однако, если я делаю это в моей системе, «System Commit» (в ProcExp) имеет размер 15,4 ГБ, а Sum (Private Bytes) - 11,5 ГБ. Я что-то пропустил? Dunken 5 лет назад 0
Нет, я говорю, что приватные байты каждого процесса - это его вклад в общий заряд фиксации (= "системный коммит"). Но есть и другие, кто вносит свой вклад в последний итог. Не выгружаемый пул плюс виртуальный размер выгружаемого пула, как правило, являются крупнейшими «общесистемными» участниками. Распределение AWE - другое (потому что они вынимают физическую память из «обращения»), но они обычно редки. Может быть, вы могли бы опубликовать несколько скриншотов? Jamie Hanrahan 5 лет назад 0
Конечно, скриншот добавлен. Не выгружаемый пул и виртуальный размер выгружаемого пула кажутся довольно низкими ... Dunken 5 лет назад 0
Также добавьте вкладку «Использовать счетчики» из RAMmap (sysinternals). Jamie Hanrahan 5 лет назад 1
... ваши снимки RAMmap и ProcExp "Информация о системе" были сделаны одновременно? Jamie Hanrahan 5 лет назад 0
Почти, как вы можете видеть, «Физическая общая память» совпадает. Dunken 5 лет назад 0
Это объем оперативной памяти, доступной для Windows. Это редко изменяется, если вы не добавите или не удалите RAM. Jamie Hanrahan 5 лет назад 0
Да, я знаю. Я просто хотел отметить, что я сделал оба снимка одновременно ... Dunken 5 лет назад 0
Я просто говорю, что вывод «оба были взяты одновременно» не следует из наблюдения «Физические совпадения общей памяти». Во всяком случае .... да, у вас есть много коммитов, которые не могут быть учтены. Я подозреваю, что это в коде, который входит в сопоставленные файлы и отображается как копирование при записи. Jamie Hanrahan 5 лет назад 0
Э-э ... глупый я ... Хорошо спасибо. Я пытаюсь исследовать это дальше ... Dunken 5 лет назад 0