Поиск утечки памяти windows

Обновлено: 06.07.2024

Узнайте, как найти утечку памяти и устранить ее в Windows 7, 8 и 10

В Windows утечка памяти происходит, когда приложение или системный процесс неправильно высвобождают блок оперативной памяти в диспетчер памяти операционной системы, когда он больше не нужен. В некоторых случаях программа может вернуть только часть использованного блока памяти, в других ничего не освобождается. Поскольку физическая ОЗУ является ограниченным ресурсом, важно убедиться, что у вас достаточно ресурсов для обработки рабочей нагрузки. Хотя в Windows существует несколько типов утечек памяти, самой распространенной на данный момент является проблема с резервной памятью. Возвращаясь к Windows 7, проблема с резервной памятью по-прежнему широко распространена в Windows 10. Как только ваша резервная память полностью израсходует вашу свободную память, ваша система может начать зависать и даже зависать. Поскольку утечка памяти обычно является результатом программной ошибки или сбоя, важно постоянно обновлять все драйверы.

Найти утечку памяти с помощью монитора ресурсов Windows

Нажмите клавишу Windows + R , введите resmon , затем выберите ОК .

Выберите вкладку Память , затем выберите Фиксация , чтобы изменить порядок списка.

Следите за режимом ожидания (синяя полоса) с приложениями, с которыми вы обычно работаете.

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

Перейдите на страницу Sysinternals в RaMMap и выберите Загрузить RaMMap .

Перейдите в папку Загрузки , скопируйте архив RaMMap в нужную папку и распакуйте его.

Нажмите правой кнопкой мыши файл приложения RaMMap и выберите Запуск от имени администратора .

Выберите Да .

Просмотрите УСЛОВИЯ ЛИЦЕНЗИИ НА ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ SYSINTERNALS , затем выберите Согласиться .

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

Если ваша система теряет свободную память более постепенно, вам может потребоваться некоторое время запустить RaMMap. Запишите вашу резервную память до и после, чтобы увидеть, если у вас есть утечка оперативной памяти.

Вы также можете более подробно рассмотреть каждый процесс, который использует вашу физическую память, на вкладке Процессы .

Проверьте оперативную память с помощью средства диагностики памяти Windows

  1. Нажмите клавишу Windows + R , введите mdsched.exe , затем выберите ОК .
  2. Выберите Перезагрузить сейчас и проверьте наличие проблем (рекомендуется) .
  3. Тест начнется и может занять несколько часов. Следуйте инструкциям на экране после завершения теста.

Пустая резервная память в Windows с RaMMap

В дополнение к мониторингу использования вашей памяти, RaMMap также может использоваться для очистки вашего резервного списка вручную.

  1. Нажмите правой кнопкой мыши файл приложения RaMMap и выберите Запуск от имени администратора .
  2. Выберите Пусто , затем Пустой резервный список .
  3. Ваша резервная память теперь должна быть значительно ниже.

Очистка резервной памяти с интеллектуальным очистителем резервных списков

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

Перейдите в папку Загрузки , щелкните правой кнопкой мыши архив ISLC 7z и выберите Запуск от имени администратора .

Выберите Да , когда появится окно контроля учетных записей.

Перейдите в папку, выберите ОК , а затем Извлечь .

После извлечения щелкните правой кнопкой мыши Интеллектуальный очиститель резервных списков ISLC и выберите Запуск от имени администратора .

Выберите Да , когда появится диалоговое окно UAC.

Выберите Очистить резервный список , чтобы вручную очистить резервную систему. Изменить значения для; Размер списка не менее , а Свободная память меньше в соответствии с вашими требованиями.

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

Устранить утечку памяти в Windows 10 с помощью FreeStandbyMemory.bat

Перейдите на страницу сценария Pastebin, выберите скачать , затем Сохранить файл .

Перейдите в папку Загрузки , щелкните правой кнопкой мыши freestandbymemory (пакетный файл) и выберите Запуск от имени администратора .

Выберите Дополнительная информация .

Выберите Запустить в любом случае .

Выберите Да .

После добавления сценария выберите любой ключ для продолжения. FreeStandbyMemory теперь будет работать в фоновом режиме в вашей системе.

Чтобы удалить сценарий, перейдите на страницу Этот ПК> Windows (C :)> Windows , щелкните правой кнопкой мыши FreeStandbyMemory и выберите Удалить .

Исправьте утечку памяти, обновляя драйверы

Хотя существует несколько инструментов для проверки устаревших драйверов, лучше проверять их по отдельности, чтобы убедиться, что все обновлено.

Оперативной памяти много не бывает: любой доступный объём достаточен лишь «до поры, до времени», а там найдётся, куда его применить. Хорошо, когда это действительно полезные задачи. Работа. Игры. Исследования. Плохо, когда оперативка заканчивается не по вине пользователя, но по раздолбайству разработчика.


Причин тому много, способов же решения… давайте обо всём по порядку.

Верните мой 97-й

Незаконный захват оперативной памяти приложениями – прямое следствие технологического прогресса. Вычислительных ресурсов, спасибо закону Мура, становится больше (да и цена их падает год от года), а стоимость работы высококвалифицированного специалиста, увы (и вновь к счастью для нас, IT'шников), следует обратной динамике. Приложения обрастают новыми возможностями, для быстрой разработки вводятся очередные слои абстракций… Двадцать лет назад код был куда ближе к «железу», нежели сейчас. Огромное число прослоек и промежуточных технологий – одно из многих зол, приводящих к плачевной ситуации. 15 мегабайт оперативной памяти для (!) калькулятора. Кошмар!


И ладно бы ситуация улучшалась, так нет: разработчики берут старые инструменты, придумывают еще более простые и многофункциональные новые, проходит несколько лет и цикл повторяется. Подумать только, недавно мы радовались CSS 3.0 и скругленным уголкам простым свойством объекта, затем Bootstrap'у, сейчас – очередной надстройке-комбайну. Write less, do more во все поля.

Комфортабельные троллейбусы из хлеба

Современные браузеры – это не только ценный гипертекст, но и три-четыре десятка полезных фич. Воспроизведение видео, работа с документами, и другие расширения – почти что операционка в миниатюре. С кучей собственных модулей от разных разработчиков, и всё это соединено кое-как. Работает зачастую так же. Миллион открытых вкладок, сложная вёрстка, фреймворк на фреймворке – одни из основных генераторов утечек.

Как бороться? Поставить какой-нибудь блокировщик рекламы и экстеншн типа The Great Suspender, который выгружает из памяти неиспользуемые страницы и сохраняет во вкладке «минимум» – удобно и эффективно снижает фоновый отжор памяти.


Не все adblock'и одинаково полезны

Да, софт, который вырезает назойливые баннеры и код всяких отслеживалок, в определенных случаях снижает нагрузку и на процессор, и на оперативку. Но не всегда. Эффективность данного решения зависит напрямую от качества его исполнения. Софт, работающий на уровне системы в роли прокси-сервера (отсекающий трафик с рекламных площадок до того, как он попадёт в браузер) сам по себе потребляет некоторый объём памяти, но он более-менее статичен. А вот расширения и модули для популярных браузеров создают монструозные конструкции на месте вырезанных рекламных фреймов. Да, рекламы на странице становится меньше, вот только потребление памяти данной вкладкой может вырасти не на каких-то 10-15%, а в несколько раз.

Проблемы кэширования ресурсов

Этим страдают в большинстве своём игры-песочницы, как стационарные, так и запускаемые внутри браузера: Factorio, Rim World, Minecraft с кучей модов… При определённом стечении обстоятельств (например, оставили производство на ночь, чтобы игра зарабатывала, пока вы спите) можно проснуться с наглухо повисшим компьютером. Ну или очень медленно работающим. При этом в плане оперативной памяти всё будет «ок» – сколько потребляла игра, столько и потребляет.


В 90% случаев такого поведения у пользователей установлен SSD и включены одновременно файл подкачки и режим гибернации. Игра сбрасывает неиспользуемые ресурсы из оперативки в своп, «Винда» кэширует их и сохраняет на случай ухода в сон, далее графика используется повторно и вновь откладывается в «долгий ящик». Вот только старые копии никуда не удаляются – спустя несколько часов, в зависимости от объёма накопителя, свободное место на нём заканчивается, система падает до перезагрузки и очистки временных файлов. Не пытайся игра «оптимизировать» расход оперативной памяти, выгружая и вновь подкачивая ресурсы – текла бы как обычно, с постепенным замедлением работы и последующим крашем.


Варианты решения: проверка гипотезы какой-нибудь утилитой типа TreeSize, удаление накопленных мусорных asset'ов, перенос подкачки на объёмный HDD или отключение гибернации в Windows 10, написание багрепорта на форум, ожидание патча.

У разработчика лапки

Иногда утечки – это просто утечки. Фотошоп любит и умеет отжирать большие объёмы памяти, особенно сразу после выхода нового номерного релиза. Благо в самом приложении есть инструмент ограничения доступного объёма оперативки (не стоит выделять больше 66%), назначения кэширующих дисков и всего такого. В качестве альтернативы можно подождать полгода и дождаться стабильной версии. Киллерфичи редко бывают настолько нужны, чтобы мириться с багами.


Торрент-клиенты. Множество одновременно установленных подключений, столько же одновременно скачиваемых файлов, проблемы с соединением – и соответствующий расход памяти. Решение – ограничение на количество исходящих соединений и скорости отдачи. Правильные коэффициенты подбираются вручную.

Софт принтеров / сканеров / камер. В анамнезе – написанный за еду индусский код: кривой, как камасутра. Медицина в этом случае бессильна – тут уж ибо использовать открытые / универсальные аналоги, либо писать багрепорты и молиться Шиве, чтоб тот покарал проклятых халтурщиков.

Майнер-малварь. Иногда утечка памяти «в никуда» – повод расчехлить антивирус. Главная защита криптовалют от «оптимизации» их добычи аппаратным методом – увеличение сложности алгоритма в направлении «нужно больше памяти для расчётов». Поэтому фоновые майнилки могут спалиться на потреблении оперативки. Причём приобщиться к числу «шахтёров» можно и незаметно для себя: чего стоит только известный скандал с uTorrent, «бонусом» к которому пользователи получали приложение-майнер Epic Scale. Да и один популярный трекер минувшей осенью засветился в фоновой добыче криптовалюты прямо в браузерах посетителей.


Война без конца

Пройдёт ещё немало времени до того, как будет написан качественный ИИ, способный разгрести завалы кривого кода. А пока приходится бороться с утечками памяти проверенными методами: с бубном, плетью и багрепортом. Или наращивать объёмы и не замечать этих самых утечек. Конечно, иметь на борту 16, 32 или даже 64 гига быстрой оперативки – это хорошо, и у Kingston всегда найдётся подходящее решение. Важно помнить, что кривому софту любой объём не помеха – просто с хорошим запасом оперативной памяти он дольше проработает без проблем.

Есть интересные примеры утечек памяти в системе? Пишите в комментах – всем будет интересно.

Утечка оперативной памяти: и сразу к делу

столбцы информации оперативной памяти в диспетчере задач

много полезного из окна мы всё равно не увидим. Дело в том, что Диспетчер задач Windows традиционно отображает рабочий набор памяти (т.е. выделяемой). Но не объёмы реально используемой. В чём разница? Проще говоря, некоторая часть из рабочего набора памяти может работать сразу на несколько приложений . Этот тип памяти получил название Разделяемая (Shared Memory). И вот здесь и начинаются проблемы. И всё потому, что рабочий набор памяти может быть ГОРАЗДО БОЛЬШЕ, чем объём памяти используемой.

Причины утечки

К более результативным способам как обнаружить утечку памяти мы ещё вернёмся, а пока посмотрим в корень проблемы. Профессионалы предлагают разделить путь к ней на три вопроса:

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

  • утечка в системном ядре (Kernel Mode)
  • утечка на уровне пользователя (User Mode)

Утечка оперативной памяти: а вам не показалось?

  • запускаем подозрительный процесс и оставляем его фоном
  • в строке поиска вводим быструю команду Windows
  • выбираем слева Системный монитор и удаляем автоматические счётчики, щёлкнув по красному крестику

удаление счётчиков из системного монитора

добавить счётчики в системный монитор

счётчик для процессов

а затем подсчёт Байт исключительного пользования. Нам осталось подобрать само имя процесса. Если вы хотите выбрать несколько, зажимайте Shift: при выборе. Заканчиваем кнопкой Добавить>> и смотрим:

причина утечки памяти

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

свойства системного монитора

утечка оперативной памяти

Однако процесс поиска можно под-ускорить или под-уточнить. Попробуйте добавить ещё несколько счётчиков. Проверьте, что подозрительные процессы запущены. А среди новых счётчиков найдите:

форма отображения статистики счётчиков

свойства системного монитора

Попейте чайку, пока счётчики не разгонятся. Через указанное время можно сделать предварительные выводы. А они заключаются в следующем:

В одну статью диагностику и решение мне запихнуть не удалось. Так что в следующей статье рассмотрим варианты как попытаться победить утечку в зависимости от источника проблемы: ядро или пользователь?

Средства диагностики

Для приложений переднего плана можно воспользоваться документацией.

однако эти средства не работают непосредственно с фоновым приложениемWindows IoT Core. Одним из способов профилирования кода, используемого в фоновом приложении, является перенос его в приложение переднего плана для анализа:

Добавление пустого приложения в фоновое решение приложения

Щелкните правой кнопкой мыши пустые ссылки на приложение и добавьте ссылку на фоновое приложение .

Измените метод Run () фонового приложения , чтобы проверить, имеет ли параметр таскинстанце значение null, и обрабатывайте эти случаи по-разному.

Из вызова Бланкапп баккграундапп:: Run (null)

Установите точку останова в вызове Баккграундапп:: Run

значком моментального снимка

При попадании в точку останова найдите средства диагностики окна и нажмите кнопку со .

Сделать еще один моментальный снимок

Используйте окно средства диагностики для диагностики утечек.

Создание тестового приложения

Замените код в Стартуптаск. cs на этот

На этом этапе при запуске фонового приложения на устройстве IoT необходимо использовать большой объем памяти и никогда не освобождать его. Если вы попытаетесь использовать средства диагностики на этом этапе, вы увидите нечто похожее, поскольку использование средств с фоновыми приложениями сейчас не поддерживается.

Фоновое приложение Средства диагностики

Чтобы обойти эту проблемы, мы добавим в решение приложение переднего плана. В Обозреватель решений щелкните правой кнопкой мыши папку решения и выберите добавить. New Project.

добавить новый Project рисунок 1

добавить новый Project рисунок 2

Щелкните правой кнопкой мыши узел " ссылки " нового проекта приложения переднего плана и выберите команду Добавить ссылку.

добавить новый Project рисунок 3

В диалоговом окне Диспетчер ссылок выберите проекты на панели слева. В центральной области добавьте флажок рядом с проектом фонового приложения и нажмите кнопку ОК.

добавить новый Project рисунок 4

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

добавить новый Project рисунок 5

Добавьте код для создания экземпляра объекта фонового приложения и вызова метода Run, передав значение NULL в качестве единственного параметра.

Затем в фоновом методе Run выполните проверку, чтобы убедиться, что Таскинстанце не имеет значение null, прежде чем использовать его.

  1. Установите точку останова при вызове задачи. Запуск (null).
  2. Задайте другую точку останова в таймере. Изменение (время ожидания. бесконечность, время ожидания. бесконечность) в Timer_Tick в Стартуптаск. cs.
  3. Нажмите клавишу F5, чтобы начать отладку
  4. При достижении первой точки останова нажмите кнопку моментальный снимок, чтобы задать базовый план для сравнения.

Значок снимка 1

  1. Нажатие клавиши F5
  2. При достижении второй точки останова снова нажмите кнопку моментальный снимок, чтобы захватить текущее состояние.

Теперь средства диагностики должны показывать график, увеличивая использование памяти и два моментальных снимка следующим образом:

Средства диагностики с утечками

Взгляните на строку 2 в столбце Размер кучи. Щелкните второе число со стрелкой плюс и вверх. Отобразятся примерно следующие сведения:

Таблица моментальных снимков

Сортировать по размеру различию, чтобы наибольшее число было вверху, а затем щелкнуть верхнюю строку. Над второй таблицей сведений щелкните Ссылочные типы. Во второй таблице теперь в качестве источника для всего использования памяти будет отображаться List Byte [] > .

Читайте также: