Windows использует слишком много ОЗУ, как диагностировать ресурс hog

У меня 16 ГБ оперативной памяти. При запуске без открытия приложений кроме диспетчера задач Windows использует около 3 ГБ ОЗУ. Я посмотрел на вкладку процессов, но ничего похожего не было. Как я могу узнать, почему моя Windows использует столько оперативной памяти.

Введите описание изображения здесь

Все процессы от всех пользователей

Введите описание изображения здесь


Чтение из poolmon кажется, что мой драйвер беспроводной широкополосной связи использует около 0,4 ГБ ОЗУ. Даже если я удалю, он все равно будет использовать 2,6 ГБ при запуске, что все равно слишком много.

Введите описание изображения здесь


После переустановки драйвера беспроводной сети, связанного с утечкой памяти. У меня есть новый скриншот и я хотел бы подтвердить, что это действительно утечка памяти.

Введите описание изображения здесь

У вас есть утечка памяти, вызванная драйвером. Посмотрите на большое значение памяти неоплаченного ядра. В вашем случае это более 3,7 ГБ. Вы можете использовать poolmon, чтобы узнать, какой драйвер вызывает высокий уровень использования.

Установите Windows WDK , запустите poolmon, сортируйте его через P после пула, чтобы не выгружался сверху и через B после байтов, чтобы увидеть тег, который использует большую часть памяти. Запустите poolmon, перейдя в папку, где установлен WDK, идите в Инструменты (или C: \ Program Files (x86) \ Windows Kits \ 10 \ Tools \ x64) и нажмите poolmon.exe.

Теперь посмотрите, какой pooltag использует большую часть памяти, как показано здесь:

Введите описание изображения здесь

Теперь откройте приглашение cmd и запустите команду findstr. Для этого откройте приглашение cmd и введите «cd C: \ Windows \ System32 \ drivers» без кавычек. Затем введите «findstr / s __ . », Где __ – это тег (самое левое имя в poolmon). Сделайте это, чтобы узнать, какой драйвер использует этот тег:

Введите описание изображения здесь

Теперь перейдите в папку драйверов (C: \ Windows \ System32 \ drivers) и щелкните правой кнопкой мыши соответствующий драйвер (intmsd.sys в приведенном выше примере изображения). Нажмите «Свойства», перейдите на вкладку «Сведения», чтобы найти имя продукта. Найдите обновление для этого продукта.

Если в пуле пула отображаются только драйверы Windows или перечисленные в файле pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt" )

Вы используете xperf для отслеживания того, что вызывает использование . Установите WPT из Windows SDK , откройте cmd.exe как admin и запустите это:

Xperf -on PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C: \ pool.etl

Захватить 30-60 градусов роста. Откройте ETL с помощью WPA.exe, добавьте диаграммы пулов в область анализа.

Поместите столбец pooltag на первое место и добавьте столбец стека. Теперь загрузите символы внутри WPA.exe и разверните стек тега, который вы видели в poolmon.

Введите описание изображения здесь

Теперь найдите другие сторонние драйверы, которые вы можете увидеть в стеке. Здесь тег Thre (Thread) используется AVKCl.exe из G-Data. Найдите исправления драйвера / программы, чтобы исправить это.

Ну, во-первых, прежде чем я перейду к более подробному ответу. В вашем первом снимке экрана ваш Non-Paged Pool (тип использования памяти ядра) составляет 1,3 ГБ. Это кажется необычайно высоким для меня, особенно всего за 30 минут после загрузки. Наверное, я мог видеть, как NP Pool становится таким высоким после длительного использования или с программой, которая протекает как сито. Для сравнения, мой NP Pool обычно составляет от 100 до 200 мегабайт, а мой выгружаемый пул может достигать 400 или 500 (и это происходит после того, как моя система работает без перезагрузки в течение нескольких недель).


Вы можете включить несколько дополнительных столбцов в диспетчере задач, щелкнув правой кнопкой мыши заголовки столбцов и выбрав столбцы выбора. Вы должны добавить Working Set (private) , Working Set (shared) , Commit и NP Pool . Я просматриваю все ваши процессы у всех пользователей и вижу, есть ли у каждого из них NP Pool больше, чем около 256 КБ. Если вы видите какие-либо, особенно те, которые значительно выше, это может быть источником проблемы или, по крайней мере, ее частью.

Ваш общий рабочий набор, объем физической памяти, используемый процессом, представляет собой комбинацию частных и общих рабочих наборов (WS). Частный обычно больше для большинства процессов, однако могут быть и такие, которые используют большее количество общего WS. Обычно они должны суммироваться с суммой WS. Commit – это объем вашего рабочего набора, который был привязан к хранилищу резервных копий (в большинстве случаев – файл страницы Windows). Фоновые приложения часто имеют большее значение Commit, чем WS, что указывает на то, что большая часть их выгружаемого пула была выгружена из памяти и в ваш файл подкачки (что довольно нормально для настольных приложений, которые были сведены к минимуму и не использовались какое-то время).

Non-Paged Pool – это память, которая не может и никогда не будет заменена физической памятью … это фактически ваше постоянное минимальное использование физической памяти. В памяти пула NP часто содержится код программы и критические разделы, которые должны находиться в физической памяти, чтобы вести себя корректно или надежно, специальные кучи и т. Д. Из 60 процессов, если все они имеют 256 Кбайт памяти пула NP, тогда ваше абсолютное минимальное использование физической памяти Будет около 15 360 КБ. В большинстве случаев одно или два приложения могут иметь 256 КБ NP Pool, в то время как большинство из них меньше, часто значительно меньше (или нет). Очень маловероятно, что система будет выводить на экран весь набор рабочих процессов, поэтому никогда не ожидайте, что использование памяти будет настолько низким.


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

Windows управляет памятью для вас и автоматически помещает данные в и из памяти в файл и из него (swap). Если вы запустите процесс, который нуждается в 9 ГБ памяти, и ваша система уже использует 4 ГБ (из 12 ГБ), система автоматически определит, какие процессы не нуждаются в немедленном доступе ко всему рабочему набору, и она отобразит некоторые или все Их выгружаемого пула для обмена, чтобы освободить лишний 1 ГБ. Если вашему большому процессу в конечном итоге потребуется больше памяти, окна еще больше уменьшат рабочий набор других процессов, пока у него не будет достаточно свободного места для выделения вновь запрошенного блока. Ваш большой процесс может в конечном итоге потреблять всю доступную память, кроме NP Pool, и, возможно, некоторые дополнительные минимальные накладные расходы для периодического выполнения процессов, которые не позволяют Windows освобождать больше своего рабочего набора (т. Е. У них есть ожидающие ошибки страницы, которые Windows в противном случае заменила бы Физической памяти, но поскольку они запрашиваются, они не могут быть перемещены.)

Если для процесса требуется больше памяти, чем к нему разрешен доступ (32-битные процессы обычно могут обращаться к 2Gb, а некоторые – чуть меньше 4 ГБ с улучшенными технологиями, в то время как 64-битные процессы обычно могут получать около 48 ГБ памяти), тогда окна иногда пытаются Для виртуализации своей памяти с подкачкой. Если 32-битное приложение хочет использовать его максимально допустимое пространство 2 ГБ, но доступно только 1,2 ГБ, окна будут зарезервировать полный файл 2Gb в файле страницы и перенести собственные данные процессов в файл и из файла страницы по мере необходимости, чтобы Поддерживайте использование памяти приложения. Общее использование «памяти» в этом случае может оказаться больше, чем доступная физическая память при движении по Total Commit. Total Commit обычно будет максимальна при большом размере файла общей страницы, который при управлении системой обычно составляет 2-3 раза от физической памяти. В вашем случае Total Commit будет около 24 ГБ или 2x вашей физической памяти 12 ГБ (и это указано в первом снимке экрана, где указано: Commit (GB) 3/23).


Один последний момент. Вы сказали в своем ответе, что у вас 16 ГБ ОЗУ, где диспетчер задач видит только 12 ГБ ОЗУ. Здесь одна из двух вещей. Либо ваша система действительно имеет только 12 ГБ ОЗУ, либо одна из ваших палок не регистрируется должным образом. Если палка бара (я предполагаю 4x 4Gb палки), это может быть плохо, может не быть полностью посажены на вашей материнской плате, или на вашей материнской плате может возникнуть проблема с обнаружением памяти.

Чтобы проверить, является ли это последним, вы должны сначала обновить BIOS вашей материнской платы до последней версии. У меня была аналогичная проблема … мои шесть триплексных DDR3 палочек RAM (6x 2Gb) были хороши на основе индивидуального тестирования каждого из них … но моя материнская плата случайно решила не считать один или два из них так часто, Часто оставляя меня только с 8 ГБ барана. Обновление BIOS устранило проблему, и теперь у меня есть надежный доступ ко всем 12Gb моей памяти.

Как я могу узнать, почему моя Windows использует столько оперативной памяти.

Он использует так много ОЗУ, потому что он предназначен для этого. При использовании ОЗУ абсолютно нет затрат. Фактически, используемая оперативная память лучше, чем свободная оперативная память, потому что операционной системе не нужно ничего делать, чтобы ее использовать. Использование свободной памяти требует использования ее, которая требует усилий.

Если вы думаете: «Я хочу, чтобы моя оперативная память была бесплатной, поэтому я могу использовать ее позже», забудьте об этом. Теперь ОЗУ не должно быть бесплатной, чтобы использовать ее позже. Вы можете использовать его сейчас и использовать его позже. Здесь нет компромиссов – нет абсолютно никаких недостатков в использовании ОЗУ.

ОЗУ поддерживается и напрямую переключается с одного использования на другое, без необходимости прилагать усилия, чтобы освободить его, просто чтобы снова использовать его. Современные операционные системы оставляют RAM свободными только тогда, когда у них нет другого выбора.

Причиной, не упомянутой выше, является Hyper-V.

Я смог идентифицировать его с отличной утилитой RamMap :

Введите описание изображения здесь

Снимок экрана после. До того, как память «Lock Locked» превысила 6 ГБ, более 80% ОЗУ на этой конкретной машине. Мне пришлось зайти в Hyper-V Manager и отключить «Динамическую память». Любопытно, что даже после повторного включения памяти память «Lock Locked» оставалась низкой – я могу только предположить, что предыдущие экземпляры увеличили ее и что Hyper-V автоматически не уменьшает выделенную память:

Введите описание изображения здесь

Interesting Posts

Ошибка: Ошибка в настройке ресурсов. Ожидаемый ответ содержать массив, но получил объект?

Процесс службы уничтожается после удаления приложения из лотка приложения.

Компьютерные вентиляторы идут на 100% при выключении

Android-стиль слайдов Android

Графическое изображение пользователя Facebook не будет отображаться на мобильных устройствах

Как фильтровать файл для строк, содержащих строку в Sublime Text 2?

Spark DataFrame: подсчитывать различные значения для каждого столбца

Bootstrap 4 выравнивает элементы навигационной панели вправо

Как вы сериализуете объект на C ++?

Регистрация и использование пользовательского протокола java.net.URL

Как получить значение текстового поля с помощью jQuery?

Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net

Ошибка при попытке запуска проекта: невозможно запустить программу. Не удается найти указанный файл

Лучшая практика: преобразование результата запроса LINQ в DataTable без цикла

Несколько удаленных рабочих столов на одном сеансе

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