tl; dr: Загрузите все 5 файлов из FindZombieHandles, запустите его и посмотрите, какой процесс создает всех этих зомби.
Вы были правы, заметив эту проблему. 1
Есть несколько общих причин:
- Утечка ручки, особенно объектов GDI
- Утечка ручки, приводящая к процессам зомби
- Память заблокирована драйвером, что может быть связано с ошибкой драйвера или даже с нормальной работой (например, раздувание VMware намеренно "съест" вашу оперативную память, чтобы попытаться сбалансировать ее между виртуальными машинами)
Получение дополнительной информации
Теперь первое, что мы можем сделать, - это использовать отличный инструмент RAMMap , который будет определять широкие категории, под которые попадает использование памяти. Они не обязательно говорят вам, что это было, но дают вам подсказку, где искать дальше.
В вашем конкретном случае я возвращаюсь к предоставленному вами скриншоту. Вы хотите взглянуть на столбец Active
- столбец Standby
содержит кэши, попадающие в "доступную" память. Обратите внимание, что Page Table
очень высока - я ожидаю, что она будет примерно 512 МБ, а не более 2 ГБ!
Сужение
Отсюда можно догадаться: это, вероятно, связано с зомби-процессами. Процесс зомби может происходить в Windows, когда один процесс запускает другой, который содержит дескриптор запущенного процесса. Когда запущенный процесс завершается, ожидается, что процесс запуска освободит эти дескрипторы. Когда этого не происходит, они остаются до тех пор, пока существует процесс запуска.
На самом деле мы можем получить дальнейшее подтверждение на вкладке Процессы RAMMap. Обратите внимание, что в вашем случае сортировка по имени процесса, тысячи экземпляров tasklist.exe
и сотни экземпляров powershell.exe
. Фактически, все, что там с использованием частной памяти 0 K
является красным флагом процесса, который завершился, но все еще зомбируется.
Теперь вам нужно выяснить, какой процесс создает всех этих зомби. Есть несколько способов сделать это. Вы можете использовать диспетчер задач на вкладке Details и добавить столбец Handles. Любой процесс, содержащий большое количество зомби, также будет иметь слишком много открытых ручек. Вы также можете использовать Process Explorer, чтобы посмотреть, какие дескрипторы открыт для определенного процесса.
Однако, безусловно, самый простой способ - это использовать FindZombieHandles 2 (вам нужно загрузить все 5 файлов в один каталог). Если вы запустите этот инструмент (как администратор), он должен сказать вам, какой процесс создает и удерживает всех этих зомби. Оттуда вы можете завершить процесс, удалить приложение или сообщить об этом разработчику.
1 Как я объяснил в другом месте, на вкладке "Процессы" диспетчера задач отображается использование памяти, за исключением дисковых кешей, поэтому общее (Linux) объяснение "свободная оперативная память расточительна" обычно не применяется. Что касается диспетчера задач, дисковый кеш является частью доступной памяти. Не упоминается о "свободной" памяти.
2 Огромное спасибо Брюсу Доусону за этот инструмент.