В статье приводится описание способов вычленения такой проблемы как утечка оперативной памяти. Здесь вы ознакомитесь с тем, как убедиться в том, что утечка по памяти присутствует в Windows, и в чём вероятная причина утечки. Утечка оперативной памяти всегда самый настоящий кошмар для каждого из пользователей. Но среди них прежде всего эта проблема бьёт по разработчикам с одной стороны и по владельцам серверов с другой. Первые сначала разрабатывают “кривое” приложение, на которое впоследствии сыпется куча рекламаций, а вторые мучаются, страдая от лавинообразных потерь в оперативке, в конце концов перезагружая сервера с кучей извинений в адрес клиентов.
Первое, в чём стоит убедиться, что в периодических “фризах” Windows виновата действиьельно утечка оперативной памяти. И у вас, вероятно, уже есть подозрение на какой-то конкретный процесс. Мы, обычные пользователи Windows, привыкли использовать для подобных проблем Диспетчер задач. Он, к слову, от версии к версии становится всё удобнее в смысле анализа и вероятных выводов в сторону системных вопросов. Но в свете нашей проблемы, даже развернув столбцы распределения RAM Диспетчера по максимуму…
много полезного из окна мы всё равно не увидим. Дело в том, что Диспетчер задач Windows традиционно отображает рабочий набор памяти (т.е. выделяемой). Но не объёмы реально используемой. В чём разница? Проще говоря, некоторая часть из рабочего набора памяти может работать сразу на несколько приложений. Этот тип памяти получил название Разделяемая (Shared Memory). И вот здесь и начинаются проблемы. И всё потому, что рабочий набор памяти может быть ГОРАЗДО БОЛЬШЕ, чем объём памяти используемой.
К более результативным способам как обнаружить утечку памяти мы ещё вернёмся, а пока посмотрим в корень проблемы. Профессионалы предлагают разделить путь к ней на три вопроса:
Кроме того, утечки оперативной памяти вообще принято разделять на две группы:
Исходя из вариантов маршрута, отслеживающего причину и тип утечки, мы можем выбрать вариант как безошибочно определить “пакостное” приложение.
Чтобы более-менее точно определить размер памяти, которая расходуется программой, нужно отслеживать байты исключительного пользования –закрытые байты памяти (private bytes) для приложения. Этот счётчик будет считать объём памяти, которое потребляется именно приложением; совместной памятью они не будут использоваться. С них и начнём. Закрытые байты – это те участки памяти, которые системой остальным программам не предлагаются; на них наложено своего рода табу. А вот чтобы посчитать эти объёмы, нам уже не обойтись без средств оценки производительности. Далеко ходить не нужно, для этих целей отлично подойдёт Системный монитор Windows. Чтобы начать работу:
perfmon
Если я подозреваю, например, процесс chrome.exe в причине утечки, мне нужно его найти и выделить среди остальных. Выбираю счётчик Процесса…
а затем подсчёт Байт исключительного пользования. Нам осталось подобрать само имя процесса. Если вы хотите выбрать несколько, зажимайте Shift: при выборе. Заканчиваем кнопкой Добавить>> и смотрим:
Сразу рекомендую в Свойствах счётчиков выставить время перехвата от 600 сек (если есть время, можно и гораздо больше).
Сейчас появятся данные по нагрузке на оперативную память со стороны выбранной программы. Моментального результата не будет: иногда приходится ждать часами, пока опасения не подтвердятся. А “подтвердятся” выглядят примерно так:
Скачкообразное увеличение потребления свидетельствует о проблеме в связанных с процессом файлах. Проблема такого способа одна – такой картинки возможно “придётся” ждать часами, а то и днями. И это в течение единовременного сеанса. Сейчас себе такое может позволить далеко не всякий администратор. Так что этот способ (вполне себе официально документируемый) хорош либо для приложений с явными дефектами, которые сразу вешают систему в течение короткого времени, либо для “посмотреть наглядно, как оно работает”. Иногда помогает добавление ещё одного счётчика – Байт виртуальной памяти . Это показатель текущего размера виртуального адресного пространств, которое используется нашим приложением. Так вот, сравнение показаний может привести к таким выводам:
Однако процесс поиска можно под-ускорить или под-уточнить. Попробуйте добавить ещё несколько счётчиков. Проверьте, что подозрительные процессы запущены. А среди новых счётчиков найдите:
В свойствах счётчиков выставляем длительность 600 сек., форма вывода – Отчёт:
Попейте чайку, пока счётчики не разгонятся. Через указанное время можно сделать предварительные выводы. А они заключаются в следующем:
В одну статью диагностику и решение мне запихнуть не удалось. Так что в следующей статье рассмотрим варианты как попытаться победить утечку в зависимости от источника проблемы: ядро или пользователь?
Успехов.