Высокая занятость оперативной памяти при простаивающем компьютере пугает пользователей Windows третье десятилетие подряд. Значительную часть этого объёма занимает список ожидания – кэш недавно прочитанных файлов и загруженного кода, который отдаётся любому процессу по первому требованию. Программы-оптимизаторы ОЗУ рисуют освобождённые гигабайты, но за красивой цифрой стоит сброшенный кэш и повторное чтение тех же данных с накопителя. Механика диспетчера памяти давно описана в документации Microsoft, и по ней видно, за какими счётчиками имеет смысл следить и в каких редких случаях очистка списка ожидания всё-таки оправдана.

Что лежит в списке ожидания и почему это не мусор
Физическая память в Windows разложена по спискам страниц. Страница размером 4 КБ либо принадлежит рабочему набору какого-то процесса, либо выведена из него и попала в один из вспомогательных списков. Когда страница выводится из рабочего набора, а её содержимое уже есть на диске, она переносится в список ожидания и дальше работает как дисковый кэш. Если содержимое изменено и на диске такой копии нет, страница попадает в список изменённых, записывается оттуда на диск – в файл подкачки или в исходный файл – и только затем оказывается в списке ожидания.
Рабочий набор – страницы физической памяти, к которым процесс обращается прямо сейчас. Усечение рабочего набора не завершает процесс и не теряет данные: страницы переезжают в списки ожидания и изменённых, откуда возвращаются при первом же обращении.
Список ожидания (standby list) – страницы физической памяти, выведенные из рабочих наборов, но сохранившие содержимое. Они доступны для выделения любому процессу и одновременно служат кэшем: повторное обращение возвращает страницу владельцу без чтения с накопителя.
Список ожидания не один. Начиная с Windows Vista каждой странице присваивается приоритет от 0 до 7, и диспетчер памяти ведёт восемь отдельных списков, чтобы первыми переиспользовались наименее ценные страницы, а не случайные. Данные сетевых передач и фоновых задач оседают в нулевом приоритете, страницы высокоприоритетных процессов – в верхних списках. Размеры всех восьми показывает вкладка Priority Summary в утилите RAMMap из набора Sysinternals; текущая версия 1.63 опубликована .
Пустая память при этом не считается достижением. В архивной записи доклада Марка Руссиновича на конференции PDC прямо сказано, что низкий объём свободной памяти нормален и даже полезен, а служба упреждающей загрузки SuperFetch (сейчас называется SysMain) целенаправленно сокращает свободный список, перенося страницы в список ожидания.
| Список страниц | Что в нём | Как освобождается |
|---|---|---|
| Активные | Рабочие наборы процессов и ядра, невыгружаемый пул | При завершении процесса или усечении рабочего набора |
| Изменённые | Страницы с несохранёнными изменениями | Только после записи на диск, затем переходят в список ожидания |
| Ожидание | Кэш файлов и кода, копия уже есть на диске | Немедленно, по приоритету от 0 к 7 |
| Свободные | Страницы без полезного содержимого | Выдаются процессам напрямую |
| Обнулённые | Свободные страницы, заполненные нулями | Выдаются под новые выделения памяти |
Порядок, в котором система забирает память под новый запрос, задан жёстко: сначала свободные и обнулённые страницы, затем список ожидания от нулевого приоритета к седьмому, затем изменённые страницы – но их сперва приходится записать на диск, – и лишь в самом конце глобальное усечение рабочих наборов всех процессов. Каждая следующая ступень дороже предыдущей, и именно на последних двух компьютер начинает тормозить.
Доступная память складывается из свободных страниц и кэша

Ключ к спору о «забитой памяти» спрятан в определении доступной памяти. Согласно документации Microsoft, доступная память складывается из свободных страниц, обнулённых страниц и страниц списка ожидания. Кэш уже посчитан как доступный. Показатель «Свободно», равный нулю или нескольким десяткам мегабайт, сам по себе ничего плохого не означает.
В диспетчере задач на вкладке «Производительность» -> «Память» за это отвечают строки «Доступно» и «Кэшировано». Страницы списка ожидания попадают в обе: и в кэш, и в доступный объём. Рядом выводятся «Используется (сжатая)», «Выделено», «Выгружаемый пул» и «Невыгружаемый пул». Подробную раскладку по типам страниц даёт монитор ресурсов:
resmon
На вкладке «Память» в блоке «Физическая память» полоса разбита на пять зон: «Зарезервировано аппаратно», «Используется», «Изменено», «Ожидание» и «Свободно». Синяя зона «Ожидание» – тот самый кэш. Именно её первой атакуют оптимизаторы.
Что происходит после нажатия кнопки очистки
Механизм у всех подобных программ одинаков и открыто задокументирован. В RAMMap те же действия собраны в меню Empty: Empty Working Sets – усечение рабочих наборов, Empty Modified Page List – сброс изменённых страниц на диск, Empty Standby List – перевод всего кэша в свободный список, Empty Priority 0 Standby List – то же самое, но только для страниц нулевого приоритета. Из консоли доступны те же операции:
RAMMap.exe -Et
Сторонняя утилита EmptyStandbyList.exe от автора Process Hacker принимает четыре аргумента: workingsets, modifiedpagelist, standbylist и priority0standbylist. Запуск через планировщик заданий раз в пять минут – типовой рецепт с форумов и типовая же ошибка.
Тонкость, которую не показывает ни один оптимизатор: после сброса списка ожидания цифра «Доступно» практически не меняется. Страницы переезжают из зоны «Ожидание» в зону «Свободно», а обе зоны входят в доступную память. Растёт единственный показатель – «Свободно», тот самый, который сам по себе не даёт производительности. Взамен теряется содержимое кэша, собранное за часы работы.
Мягкая ошибка страницы против жёсткой
Расплата приходит не сразу, и в этом причина живучести мифа. Пока страница лежит в списке ожидания, обращение к ней обрабатывается как мягкая ошибка страницы: страница возвращается в рабочий набор процесса без единой операции ввода-вывода. После очистки той же страницы в памяти нет, и обращение превращается в жёсткую ошибку – чтение с накопителя.
Мягкая ошибка страницы разрешается внутри оперативной памяти: нужная страница находится в списке ожидания, в списке изменённых или в рабочем наборе другого процесса. Жёсткая ошибка страницы требует чтения с накопителя и обходится примерно на три порядка дороже.
Разрыв в скорости никуда не делся даже на PCIe 5.0. Первое слово из модуля DDR5-6000 с таймингом CL30 приходит примерно через 10 нс: задержка считается как CL x 2000 / скорость передачи. Накопитель работает в микросекундах, причём часть времени уходит ещё до обращения к микросхемам NAND: по данным Kingston, обработка одной команды драйвером AHCI занимает 6 мкс против 2,8 мкс у драйвера NVMe. Разница с оперативной памятью – три порядка, и она объясняет, почему после «очистки» первый запуск браузера или возврат в игру ощущаются медленнее, чем полчаса назад.
| Откуда берутся данные | Стоимость доступа | Что чувствует пользователь |
|---|---|---|
| Список ожидания в ОЗУ | десятки нс | Мгновенно, без паузы |
| Сжатая память | распаковка на процессоре | Почти мгновенно, растёт нагрузка на CPU |
| Чтение с NVMe SSD | десятки мкс | Короткая, но различимая задержка |
| Чтение с SATA SSD | сотни мкс | Заметная пауза |
| Чтение с жёсткого диска | единицы мс | Видимая подгрузка и подёргивания |
Сжатая память, page combining и предзагрузка кода
Кроме списка ожидания, у диспетчера памяти есть второй слой экономии. Страницы, которым грозила выгрузка в файл подкачки, вместо этого сжимаются и складываются в хранилище сжатых страниц прямо в ОЗУ. Распаковка тратит такты процессора, но обходится дешевле, чем чтение с накопителя, и заодно бережёт ресурс SSD.
Сжатая память – страницы из списка изменённых, упакованные алгоритмом сжатия и оставленные в ОЗУ вместо выгрузки в файл подкачки. Механизм появился в Windows 10 и Windows Server 2016, а её объём виден в диспетчере задач в строке «Используется (сжатая)».
Состояние всех механизмов агента управления памятью выводит один командлет:
Get-MMAgent
В ответе перечислены ApplicationLaunchPrefetching (предзагрузка кода и данных при запуске приложений), ApplicationPreLaunch (упреждающий запуск приложений, которыми пользователь, вероятно, скоро воспользуется), PageCombining (объединение страниц с одинаковым содержимым, дедупликация в ОЗУ), OperationAPI и MemoryCompression. Каждый из них включается и выключается штатными командлетами Enable-MMAgent и Disable-MMAgent с параметром вида -MemoryCompression, без правки реестра. Отключать сжатие имеет смысл только при подтверждённой проблеме: без него страницы уходят прямиком в файл подкачки.
Оптимизатор, усекающий рабочие наборы, задевает и этот слой. Чистые страницы уходят в список ожидания, изменённые – в список изменённых, где часть сжимается, часть записывается в файл подкачки. Процессор занят сжатием, накопитель – записью, а выигрыш сводится к цифре в графе «Свободно».
Три счётчика, отличающие кэш от нехватки памяти
Высокая занятость ОЗУ сама по себе не диагноз. Диагноз ставится по давлению на память, и у него есть измеримые признаки. В руководстве Microsoft по разбору проблем диспетчера кэша и памяти (документ распространяется в том числе на Windows 10 и Windows 11) названы три счётчика системного монитора:
- Memory\Available MBytes – собственно доступная память;
- Memory\Long-Term Average Standby Cache Lifetime (s) – средний срок жизни страницы в списке ожидания; значение ниже 1800 секунд означает, что кэш переиспользуется быстрее, чем успевает окупиться;
- Memory\System Cache Resident Bytes – сколько физической памяти занял системный файловый кэш.
Счётчики открываются оснасткой perfmon. К ним стоит добавить два наблюдения. Первое – столбец «Ошибок отсутствия страницы в памяти/сек» на вкладке «Память» монитора ресурсов: это жёсткие ошибки, те самые, которые идут на диск. Второе – вкладка Priority Summary в RAMMap, где столбец Repurposed показывает, сколько страниц каждого приоритета уже переиспользовано. Массовое переиспользование страниц с приоритетом 5 и выше означает, что памяти не хватает по-настоящему.
Сочетание, при котором пора думать о модулях памяти, а не об утилитах: доступная память у нуля, срок жизни кэша меньше получаса, жёсткие ошибки идут потоком, приложения открываются с паузами. Если же диспетчер задач показывает 85% занятости, а компьютер отзывчив, перед вами работающий кэш, а не проблема.
Когда очистка списка ожидания действительно нужна
Сценарии, в которых сброс кэша осмыслен, существуют, но ни один из них не относится к регулярному обслуживанию:
- замеры производительности с холодным кэшем, когда нужен воспроизводимый старт приложения;
- поиск утечки памяти: после сброса видно, какой процесс снова набирает объём;
- разбор разрастания системного файлового кэша – в RAMMap оно видно по большому числу активных страниц Metafile или Mapped file. До Windows Server 2012 такой кэш при некоторых нагрузках рос почти до полного исчерпания доступной памяти; в более новых выпусках проблему смягчили доработки механизма усечения рабочих наборов;
- диагностика приложений, открывающих файлы с флагом FILE_FLAG_RANDOM_ACCESS: раньше он заставлял диспетчер кэша удерживать проекции файлов в памяти, а начиная с Windows Server 2016 этот флаг при решениях об усечении игнорируется.
Логика простая: очистка списка ожидания – инструмент измерения, а не ускорения. Планировщик, запускающий EmptyStandbyList.exe каждые пять минут, гарантированно даёт красивую цифру и столь же гарантированно добавляет чтений с накопителя. На быстродействие в повседневных задачах сильнее влияют список автозагрузки, отключение лишних визуальных эффектов и объём установленной памяти.
SoftRAM 95 и разбирательство FTC: тридцать лет одному обещанию
Рынок оптимизаторов ОЗУ ровесник Windows 95. В августе 1995 года компания Syncronys Softcorp выпустила SoftRAM95 с обещанием удвоить объём памяти без покупки модулей. За четыре месяца разошлось около 600 тысяч копий. В декабре продукт отозвали с рынка, а Федеральная торговая комиссия США объявила о соглашении с компанией: утверждения о SoftRAM95 в жалобе названы ложными и вводящими в заблуждение, а сам продукт, по формулировке FTC, не увеличивал объём ОЗУ и не улучшал скорость, ёмкость или иные показатели компьютера под Windows 95.
Техническую развязку описал Рэймонд Чен из Microsoft . Разбирая жалобы на сбои, он полностью дизассемблировал драйвер подкачки SoftRAM95 и добрался до процедуры сжатия. Она оказалась вызовом memcpy – побайтовым копированием без какого-либо сжатия.
Аргумент «в девяностых и в эпоху XP очистка памяти помогала» тоже стоит проверять. Минимальные требования Windows XP составляли 64 МБ ОЗУ, рекомендованные – 128 МБ. Минимум для Windows 11 – 4 ГБ, а типовая сборка несёт 16–32 ГБ. Изменился и диспетчер памяти: приоритеты списка ожидания появились в Vista, сжатие страниц – в Windows 10 и Windows Server 2016. Привычка, выработанная на конфигурации с сотнями мегабайт, переносится на современную систему по инерции.
Заключение
Оптимизаторы ОЗУ не удаляют мусор – они выбрасывают кэш, собранный за часы работы, и заставляют перечитывать те же данные с накопителя. Освобождённые мегабайты в диспетчере задач переезжают из графы «Ожидание» в графу «Свободно», не меняя объёма доступной памяти.
Опытному пользователю проще следить за сроком жизни кэша, жёсткими ошибками страниц и столбцом Repurposed в RAMMap, чем за общим процентом занятости. Начинающему достаточно правила: пока компьютер отзывчив, цифра занятости памяти не имеет значения. Когда компьютер перестаёт отзываться при 95–100% занятости и потоке обращений к файлу подкачки, помогает не кнопка очистки, а дополнительный модуль памяти.