Глубины памяти Windows (часть 2) — жизнь физической страницы: пять списков и правда о файле подкачки

· · Windows, Управление памятью, Файл подкачки, Working Set, Standby, RAMMap, Мониторинг производительности

В предыдущей статье «Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической RAM» мы проследили до момента, когда обработчик ошибки страницы выделяет физическую страницу при первом обращении к уже зарезервированной (Commit) странице. Куда же эта физическая страница уходит после удаления из Working Set?

Часто объяснение сводят к «её вытесняют в файл подкачки», но до и после этого есть несколько состояний. Неизменённая страница может перейти в Standby, сохранив содержимое. Изменённая страница сначала ждёт обратной записи на Modified. При повторном использовании она может пройти через Free или Zeroed, а если снова нужно то же содержимое, она может вернуться из Standby мягкой ошибкой (soft fault).

Эта статья берёт базу PFN как ось и прослеживает, как одна физическая страница движется через Active, Modified, Standby, Free и Zeroed. Чтение самих чисел опирается на вводную статью «What Does Windows’ “Memory Usage” Actually Mean? — Correctly Reading Working Set, Private Bytes, Commit, and the Page File».

«Глубины памяти Windows» — все 3 части

  1. Часть 1: виртуальные адреса и ошибки страниц
    Прослеживаем, когда зарезервированная виртуальная страница получает физическую RAM.
  2. Часть 2 (эта статья): жизнь физической страницы
    Прослеживаем переходы состояний страницы, покинувшей Working Set, и роль файла подкачки.
  3. Часть 3: объекты секций и копирование при записи
    Прослеживаем механизм, которым DLL, отображения файлов и общая память разделяют физические страницы.

Вопрос, на который отвечает часть 2, всего один.

Физическая страница, покинувшая Working Set, исчезает, уходит на диск или остаётся в RAM?

Предполагаемые читатели — разработчики и эксплуатация, которые хотят понять с механизма, почему Available высок и Standby тоже высок, поведение после обрезки Working Set, настройку файла подкачки и сжатие памяти. Требования к среде — Windows 10/11 или актуальный Windows Server, а нужный фон — основы Working Set, Commit и мягких/жёстких ошибок. Сложность средняя; мы используем внутренние термины вроде PFN и списков страниц, но сосредотачиваемся на том, что можно наблюдать RAMMap и PerfMon без отладчика ядра.

1. Сначала вывод

Для начала — пункты, которые легко прочитать неверно.

  • Страница, покинувшая Working Set, не обязательно сразу исчезает.
    Чистая страница остаётся на Standby и может вернуться без чтения диска, если снова нужно то же содержимое.
  • Изменённую страницу нельзя сразу переиспользовать.
    Частное содержимое становится повторно используемым после возможности записи в файл подкачки; отображённый файл — после возможности записи в соответствующий файл; и так далее.
  • Available включает Standby.
    Standby — это кэш, который ещё держит содержимое, и одновременно кандидат на повторное использование, который можно сразу забрать при необходимости.1
  • Запись в файл подкачки — не пакетная работа, которая начинается только после полного исчерпания RAM.
    Она идёт в фоне в зависимости от списка Modified и давления памяти.23
  • Файл подкачки — не просто «медленная RAM».
    Он расширяет Commit Limit, становится backing store изменённых частных страниц и поддерживает дампы сбоя.4
  • Отключение файла подкачки не чинит утечку памяти.
    Commit Limit падает, и можно потерять варианты эффективного использования RAM и возможность снимать дампы.

Одним предложением: прежде чем отбросить страницу, Windows проверяет вероятность, что она снова понадобится, и есть ли место, откуда восстановить исходное содержимое.

2. База PFN — главная книга на стороне физической RAM

PTE из части 1 представляла перевод виртуальной страницы в физическую. Главная книга, которая смотрит на это со стороны физической страницы и следит, «для чего сейчас используется эта страница RAM», — база PFN. PFN значит Page Frame Number: физическая RAM, пронумерованная по страницам.

Запись PFN концептуально отслеживает следующую информацию.

  • Текущее состояние физической страницы
  • Счётчик ссылок и счётчик совместного использования
  • Соответствующую PTE
  • Изменена ли она
  • К какому списку страниц принадлежит
  • Сведения, связанные с узлом NUMA и приоритетом

В WinDbg !pfn показывает сведения о конкретном PFN, а !memusage — использование физической памяти и итоги по каждому списку страниц.56 Чтобы наблюдать тот же мир без отладчика ядра, доступен Sysinternals RAMMap. Use Counts показывает назначение и список страниц, Priority Summary — Standby по приоритету, Physical Pages — использование по страницам.7

3. Связать пять состояний на одной схеме

Эта статья рассматривает поток физической страницы как следующие пять состояний в упрощении. Строго говоря, у актуального Windows есть состояния и списки, не нарисованные здесь — Standby по приоритету, Transition, Bad и другие — а Active означает не столько единый «список Active», сколько состояние ссылки из Working Set или подобного через действительную PTE. Даже так эта схема более чем полезна для чтения поведения памяти приложения.

Упрощённая схема физической страницы Windows, движущейся через Active, Modified, Standby, Free и Zeroed

Рис. 1: Страница, на которую ссылаются в Working Set, переходит в Standby, если чистая, и в Modified, если грязная. То же содержимое может вернуться; другое назначение либо сразу переиспользует страницу, либо идёт через Free/Zeroed при выделении, требующем нулей.

Исходник Mermaid рисунка 1 ```text flowchart LR zeroed["Zeroed\nОбнулена"] -->|Первый Touch| active["Active / Valid\nСсылается Working Set"] active -->|Трим clean| standby["Standby\nКандидат на повтор с содержимым"] active -->|Трим dirty| modified["Modified\nЖдёт обратной записи"] modified -->|Запись завершена| standby standby -->|Возврат soft fault| active standby -->|Сбросить старую идентичность| free["Free\nНе обнулена"] standby -->|Прямо под другую цель| active free -->|Для выделения с нулями| zeroed ```

Самое важное в этой схеме: выйти из Working Set и потерять содержимое — не одно и то же. Кроме того, когда страницу Standby забирают под другую цель, она не обязательно проходит Free/Zeroed по порядку. Если её отдадут пользовательскому режиму как новую частную demand-zero страницу, старое содержимое нужно стереть; если всю страницу перезапишут, как при чтении файла, идентичность Standby можно снять и страницу сразу переиспользовать.

4. Active / Valid — физическая страница, на которую можно ссылаться сейчас

Страница Active/Valid ссылается из Working Set процесса или из системного пространства через действительную PTE. ЦП достигает её обычным преобразованием адресов, поэтому сам доступ не требует ошибки страницы.

Однако нет гарантии, что страница останется Active. Чтобы поддерживать доступную память, диспетчер памяти смотрит на размер Working Set, недавность использования страницы и подобное и обрезает страницы-кандидаты. Документация Microsoft по Working Set также объясняет, что диспетчер памяти удаляет страницы из Working Set, чтобы создать доступную память.8

4.1. Обрезка — не освобождение

То, что в основном меняет обрезка Working Set, — резидентное состояние «сразу можно сослаться через действительную PTE». Различайте следующие четыре как отдельные события.

  • Убрать из Working Set
  • Освободить Commit
  • Освободить диапазон виртуальных адресов
  • Потерять исходные данные

Запуск EmptyWorkingSet или «Trim Working Set» инструмента не заменяет VirtualFree или освобождение кучи. Если снова коснуться той же страницы, она вернётся мягкой ошибкой из Standby или жёсткой ошибкой из backing store. Поэтому «я уменьшил Working Set» не значит «я починил утечку».

5. Чистая страница идёт в Standby

Даже после удаления страницы из Working Set, если содержимое всё ещё совпадает с исходным файлом или у неё уже есть безопасный backing store, её можно поместить в Standby. Типичные примеры:

  • Неизменённый код EXE/DLL
  • Неизменённый файл, отображённый в память
  • Частная страница, уже записанная обратно
  • Данные, оставшиеся в файловом кэше

Страница Standby сохраняет соответствие прежнему содержимому. Когда тот же процесс или другой нуждается в этом содержимом, если страница ещё не переиспользована, достаточно мягкой ошибки, которая заново подключает PTE.

С другой стороны, если другое выделение нуждается в физической странице, старую идентичность Standby можно отбросить и страницу переиспользовать. Если место повторного использования — частная страница пользовательского режима, требующая обнуления, готовят страницу Zeroed; если всю страницу перезапишут содержимым файла и т. п., её можно сразу переназначить без обнуления.

Эта двусторонность и есть причина, почему Standby — и кэш, и Available.

5.1. Почему Available включает Standby

MEMORYSTATUSEX.ullAvailPhys представляет физическую память, которую можно сразу переиспользовать без записи на диск, и это сумма Standby, Free и Zeroed.1

Три списка страниц, из которых состоит AvailableДоступная физическая память — сумма Standby, Free и Zeroed; страницы Active, на которые ссылаются в Working Set, не входятНе входитStandby(кандидат на повторное использование с сохранённым содержимым)Available(доступная физическая память)Free(не используется, не обнулена)Zeroed(не используется и обнулена)Active(ссылаются в Working Set)

Рис. 2: Available — сумма Standby, Free и Zeroed. Standby, которая ещё держит содержимое, тоже считается «доступной».

Поэтому нет противоречия, когда диспетчер задач показывает «Free мало, зато Cached/Standby много, а Available достаточно». Windows не оставляет свободную RAM простой; она оставляет недавно использованные файлы и код на Standby, чтобы при необходимости быстро переиспользовать их как кэш, и забирает их, если нужна другая цель.

Не заключайте «Free мало, значит сразу нехватка памяти»; смотрите вместе Available, Commit, жёсткие ошибки и задержку обработки.

6. Грязная страница ждёт на Modified

Когда приложение пишет в страницу, это содержимое больше не совпадает с исходным backing store. Перезаписать эту грязную страницу под другую цель — значит потерять данные. Поэтому изменённая страница, удалённая из Working Set, ждёт обратной записи на Modified.

Место обратной записи зависит от вида страницы.

Вид страницы Типичное место обратной записи
Частная закоммиченная страница Файл подкачки
Записываемый отображённый файл Соответствующий файл данных
Грязные данные в файловом кэше Соответствующий файл данных
Чистая страница EXE/DLL Обратная запись не нужна. Можно перечитать из исходного образа

Документация Microsoft по файлу подкачки также объясняет, что .dll, .exe и обычные файлы, уже существующие на диске, не нужно снова писать в файл подкачки, а изменённые данные без исходной дисковой копии становятся кандидатами в файл подкачки.2

6.1. Modified Page Writer

Modified Page Writer — системный рабочий, который сканирует грязные страницы с backing в файле подкачки, которые отслеживает диспетчер памяти, и записывает их в файл подкачки.3 На стороне отображённых файлов есть пути вроде Mapped Page Writer, которые совместно с файловой системой и диспетчером кэша пишут обратно в соответствующий файл.

Важно, что запись — не схема «ничего не делать, пока RAM не станет 0 байт». Windows в фоне готовит страницы, которые можно будет переиспользовать, в зависимости от списка Modified, Available, состояния файла подкачки и подобного. Когда обратная запись закончена и других действительных ссылок нет, страница идёт в Standby с сохранённым содержимым.

Пути обратной записи изменённой страницыИзменённая страница, покинувшая Working Set, ждёт на списке Modified; для частной страницы при настроенном файле подкачки Modified Page Writer пишет её в файл подкачки, а страница отображённого файла записывается Mapped Page Writer или подобным в соответствующий файл данных, затем идёт в Standby с сохранённым содержимымЧастная страница(файл подкачки настроен)Страница отображённого файлаИзменённая страница, покинувшая Working SetОжидание обратной записи на списке ModifiedModified Page Writer пишет в файл подкачкиMapped Page Writer или подобный пишет в соответствующий файлПосле обратной записи в Standby с сохранённым содержимым

Рис. 3: Место обратной записи определяется видом страницы, и оба пути идут в фоне. На системе с отключённым файлом подкачки у частной страницы нет места обратной записи, поэтому изменённые частные страницы остаются в RAM.

6.2. Отделить вывод страниц от ввода-вывода именно файла подкачки

Следующие счётчики легко перепутать; уточните, что они значат.

  • Memory\\Page Writes/sec: число операций записи подкачки, выданных чтобы освободить физическую память
  • Memory\\Pages Output/sec: число страниц, записанных на диск этими записями
  • Memory\\Page Reads/sec: число операций чтения с диска, выданных чтобы разрешить жёсткие ошибки
  • Memory\\Pages Input/sec: число страниц, вошедших в RAM из этих чтений

Заметьте, что Page Writes/sec и Pages Output/sec — не счётчики, которые выделяют только файл подкачки. Они могут расти и на пути обратной записи грязных страниц с файловым backing, например отображённых файлов. Наоборот, сторона ввода тоже не различает файл подкачки, DLL, EXE и файлы, отображённые в память.2 Чтобы выделить ввод-вывод именно pagefile.sys, не оценивайте только по этим четырём счётчикам; запишите File I/O и Disk I/O через ETW/WPA и подтвердите целевой файл, сопоставив FileObject и FileName.9

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

7. Разница между Standby, Free и Zeroed

7.1. Standby

Состояние, которое ещё держит соответствие прежнему содержимому.

  • Если нужно то же содержимое, может вернуться мягкой ошибкой
  • Если нужна другая цель, старую идентичность можно отбросить и переиспользовать
  • Есть списки Standby по приоритету

7.2. Free

Действительное соответствие прежнему содержимому потеряно, и страницу можно выделить. Однако старый битовый узор может ещё остаться в странице. Отдать её пользовательскому режиму как есть — риск утечки сведений предыдущего процесса.

7.3. Zeroed

Содержимое — нули, и страницу можно безопасно отдать как новую страницу пользовательского режима. Ошибка demand-zero из части 1 была типичным случаем получения доступной страницы Zeroed и привязки к PTE. Подготовка из Free в Zeroed идёт по спросу и состоянию системы.

Поэтому хотя «Free» и «Zeroed» обе выглядят неиспользуемыми, они различаются готовностью, связанной с безопасностью.

8. Хранилище сжатия памяти — ещё одно место назначения внутри RAM

Начиная с Windows 10, при давлении памяти диспетчер памяти в некоторых случаях может сжимать редко используемые страницы в RAM вместо немедленной записи на диск. Это собрание сжатых страниц — хранилище сжатия.

В ранней реализации Windows 10 хранилище сжатия учитывалось внутри Working Set процесса System, но в актуальном Windows оно появляется в списках процессов отладчика как отдельный процесс Memory Compression. Поэтому, исследуя текущий объём сжатия, не следуйте только Working Set процесса System. Сама цель — держать больше приложений в физической памяти и снижать дисковый ввод-вывод — не изменилась.1011

Однако имейте в виду следующее.

  • Сжатые страницы всё равно используют RAM
  • Сжатие и распаковка имеют стоимость ЦП
  • Сжатие не стирает обещание Commit
  • Нет фиксированного порядка «всегда сжимать, затем файл подкачки»
  • Политика меняется с видом страницы, давлением и историей доступа

«Используется (сжато)» диспетчера задач не значит, что сжатие полностью опустошило физическую память. Хранилище сжатия — не функция, которая делает файл подкачки ненужным; оно добавляет вариант, который тратит ЦП, чтобы снизить ввод-вывод между RAM и хранилищем.

9. Настоящая роль файла подкачки

У файла подкачки как минимум три роли.

Три роли файла подкачкиФайл подкачки расширяет Commit Limit, становится backing store редко используемых изменённых частных страниц и становится приёмником дампа сбоя системыФайл подкачкиРасширить Commit Limit(запас у потолка)Backing store изменённых частных страницПриёмник дампа сбоя системы

Рис. 4: Роль файла подкачки — не только «медленная RAM». Даже при использовании 0 он всё ещё поддерживает потолок и дампы.

9.1. Расширить Commit Limit

Commit Limit системы примерно определяется RAM плюс сумма всех файлов подкачки. Без файла подкачки Commit Limit падает до уровня чуть меньше установленной RAM. Когда Commit Total достигает потолка, новый Commit не удаётся и может привести к аварийному завершению приложения или проблемам системы.4

Это другое дело, чем «сколько ГБ сейчас записано в pagefile.sys». Файл подкачки — ещё и запас у потолка, который поддерживает обещание Commit.

9.2. Поддерживать изменённые частные страницы

Если редко используемые изменённые частные страницы имеют backing в файле подкачки, эти физические страницы можно убрать из RAM и отдать часто используемому коду и данным.4 Отключение файла подкачки уменьшает возможность убирать такие страницы из RAM. Нельзя просто сказать «быстро, потому что нет выгрузки».

9.3. Поддерживать дампы сбоя системы

Чтобы получить Memory.dmp при сбое системы, нужен файл подкачки или выделенный файл дампа, способный поддержать выбранный способ дампа.2 Полный дамп памяти, дамп памяти ядра и автоматический дамп памяти различаются по требуемому объёму.

В среде, где расследуют сбои, удаление файла подкачки только ради места может означать, что доказательств нет, когда они нужнее всего. О способах сбора см. также «Введение в сбор дампов сбоев Windows — WER/ProcDump/WinDbg».

10. Правильный размер не единообразен

Размер файла подкачки не следует решать только по фиксированной формуле вроде «1,5 × RAM». Microsoft объясняет, что подходящий размер различается по системам по следующим двум пунктам и не обобщается.2

  1. Пиковый System Commit Charge
  2. Нужный дамп сбоя системы

На практике думайте в следующем порядке.

10.1. Начать с системного управления как базы

По умолчанию Windows — системное управление. Он растёт и сжимается в зависимости от установленной RAM, спроса на Commit, требований к дампу сбоя и подобного. Без особого ограничения или результата измерения начинать отсюда безопасно.

10.2. Измерить пиковый Commit под представительной нагрузкой

Собирайте следующие счётчики в PerfMon в течение долгого периода.

  • Memory\\Committed Bytes
  • Memory\\Commit Limit
  • Memory\\% Committed Bytes In Use
  • Memory\\Modified Page List Bytes
  • Paging File(*)\\% Usage
  • Memory\\Available MBytes
  • Memory\\Page Reads/sec
  • Memory\\Page Writes/sec

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

Высокий процент использования файла подкачки сам по себе не доказывает проблему производительности хранилища. Однако прилипание к потолку — предупреждение о недостаточной ёмкости. Смотрите вместе, приближается ли Commit к потолку, ждёт ли много Modified и насыщен ли диск.2

10.3. Сначала решить требование к дампу

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

11. Посмотреть своими глазами

11.1. Смотреть списки страниц в RAMMap

Запустите RAMMap от имени администратора и сначала откройте Use Counts.7 Элементы для просмотра следующие.

  • Active
  • Standby
  • Modified
  • Modified no write
  • Free
  • Zeroed

Priority Summary позволяет подтвердить, что Standby разбит по приоритету. Processes показывает Working Set каждого процесса; File Summary и File Details позволяют следить за файловыми данными в RAM.

Для пробы один раз прочитайте довольно большой локальный файл, завершите чтение и затем Refresh. Страницы этого файла могут остаться в File Summary или на стороне Standby. Повторное чтение того же файла может восстановить ещё не переиспользованные страницы без дискового ввода-вывода или с малым вводом-выводом. Результаты зависят от давления памяти, антивируса и размера файла, поэтому смотрите направление перехода состояния, а не один набор чисел.

Заметьте, что меню Empty в RAMMap искусственно меняет состояние системы. Не очищайте Standby как улучшение производительности в продакшене; используйте только в изолированной тестовой среде.

11.2. Разделить Commit и Touch с Testlimit

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

.\\testlimit64.exe -?

Далее — Testlimit v5.24. В официальном синтаксисе v5.24 -m [MB] выделяет указанный объём памяти, -d [MB] выделяет и Touch, -e [seconds] — интервал выделения, -c [count] — число выделений. Указывайте -c последним. Если локально видно иначе, предпочитайте то использование.12

Затем попробуйте понемногу на одноразовой ВМ.

# -m 64: выделить 64 МиБ, -e 1: интервал 1 секунда, -c 8: остановиться после 8 раз
.\\testlimit64.exe -m 64 -e 1 -c 8

# То же число и интервал, с -d чтобы каждая область получила Touch
.\\testlimit64.exe -d 64 -e 1 -c 8

Пока выполняется, одновременно записывайте следующее.

  • «Выделено X/Y» диспетчера задач
  • Active, Modified и Standby в RAMMap
  • Memory\\Committed Bytes
  • Memory\\Commit Limit
  • Memory\\Available MBytes
  • Memory\\Modified Page List Bytes

Если вы действительно воспроизводите исчерпание Commit, не делайте это на хост-ПК; увеличивайте число по шагам на ВМ со снимком. Запуск, который автоматически выделяет до потолка, может заморозить экран, аварийно завершить процессы и потерять журналы. Цель не дестабилизировать ОС; цель — наблюдать, что при приближении к Commit Limit новый Commit не удаётся.

12. Четыре неверных прочтения, которых стоит избегать на практике

12.1. «Standby высок, значит утечка памяти»

Standby — повторно используемый кэш и входит в Available. Утечку судите по тому, продолжают ли расти базовая линия частного Commit процесса и разбивка выделений даже после окончания нагрузки.

12.2. «Урезать Working Set починит утечку»

Обрезка меняет только резидентность; она не освобождает Commit или виртуальное выделение. При повторном доступе страница возвращается ошибкой.

12.3. «Использование файла подкачки 0, значит он не нужен»

Файл подкачки поддерживает не только текущий объём записи, но и Commit Limit и дампы сбоя. Решать удаление только по повседневном использованию — потерять запас на пике и доказательства в момент отказа.

12.4. «Сначала сжатие памяти, затем всегда файл подкачки»

Сжатие — не фиксированный последовательный конвейер. Windows выбирает динамически в зависимости от вида страницы, эффективности сжатия, нагрузки ЦП, давления памяти и наличия backing store.

13. Итог

  • База PFN — главная книга, которая отслеживает владение, ссылки, изменение и состояние списка физической страницы.
  • Чистая страница, покинувшая Working Set, остаётся на Standby и может вернуться мягкой ошибкой, если нужно то же содержимое.8
  • Грязная страница ждёт на Modified и записывается в файл подкачки, если частная, или в соответствующий файл, если отображённая.3
  • Available — сумма Standby, Free и Zeroed; большой Standby сам по себе не нехватка памяти.1
  • Сжатие памяти сжимает страницы в RAM, чтобы снизить ввод-вывод, но не стирает роли Commit и файла подкачки.10
  • Файл подкачки поддерживает Commit Limit, изменённые частные страницы и дампы сбоя системы.42
  • Подходящий размер определяется пиковым Commit и требованиями к дампу; его нельзя решить единым множителем.2
  • Обрезка Working Set и очистка Standby — не исправление утечки памяти.

Продолжение в части 3, «Объекты секций и копирование при записи: чем на самом деле являются DLL и отображения файлов».

Мы проследим, почему файловые страницы и DLL, оставшиеся на Standby, видны нескольким процессам как одна и та же физическая страница.

Похожие статьи

Смежные области консультирования

KomuraSoft LLC занимается расследованиями давления памяти приложений Windows, исчерпания Commit, подкачки, роста Working Set и проектирования сбора дампов сбоя.

Справочные ссылки

  1. Microsoft Learn, MEMORYSTATUSEX structure. О том, что ullAvailPhys — физическая память, которую можно сразу переиспользовать без записи на диск, и что это сумма списков Standby, Free и Zeroed.  2 3

  2. Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. О том, что подходящий размер зависит от пикового Commit и требований к дампу сбоя и не обобщается; список Modified, использование файла подкачки, связанные счётчики и системно управляемый файл подкачки.  2 3 4 5 6 7 8

  3. Microsoft Learn, Data corruption on IO write. О том, что Modified Page Writer — системный рабочий диспетчера памяти, который сканирует грязные страницы с backing в файле подкачки и записывает их.  2 3

  4. Microsoft Learn, Introduction to page files. О том, что файл подкачки убирает редко используемые изменённые страницы из RAM, расширяет Commit Limit и поддерживает дампы сбоя системы.  2 3 4

  5. Microsoft Learn, !pfn (WinDbg). О том, что можно показать состояние, ссылки, адрес PTE и другое указанной записи PFN. 

  6. Microsoft Learn, !memusage (WinDbg). О том, что можно суммировать использование физической памяти и состояния страниц вроде Zeroed, Free, Standby, Modified и Active. 

  7. Microsoft Learn, RAMMap - Sysinternals. О том, что Use Counts, Processes, Priority Summary, Physical Pages, File Summary и File Details в RAMMap показывают назначение физической памяти и списки страниц.  2

  8. Microsoft Learn, Working Set. О том, что диспетчер памяти обрезает Working Set, чтобы создать доступную память, и что страницы, оставшиеся в Transition или в Working Set другого процесса, можно разрешить мягкой ошибкой.  2

  9. Microsoft Learn, FileIo_Name class. О том, что события File I/O ETW имеют FileObject и FileName, так что FileObject можно сопоставить с событиями Disk I/O, чтобы выделить ввод-вывод целевого файла. 

  10. Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. О ранней реализации хранилища сжатия Windows 10, которая помещала собрание сжатых страниц в RAM в Working Set процесса System и снижала записи на диск.  2

  11. Microsoft Learn, Find Process ID (PID) in Windows. О примерах списков процессов актуальных Debugging Tools for Windows, где под System показан процесс Memory Compression с отдельным PID. 

  12. Microsoft Learn, Testlimit - Sysinternals. Об официальном синтаксисе Testlimit v5.24, где -m выделяет память, -d выделяет и Touch, -e — интервал выделения, -c — число выделений, причём -c указывают последним. 

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Глубины виртуализации Windows (часть 3) — виртуальные машины, которые загружаются за секунды: почему WSL2, Windows Sandbox и контейнеры такие лёгкие

Почему WSL2 и Windows Sandbox стартуют за секунды и ощущаются такими лёгкими? Статья разбирает механизмы — от динамического базового обра...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Страница записывается в файл подкачки сразу после выхода из Working Set?
Нет. Неизменённая страница переходит в Standby с сохранённым содержимым и становится кэшем, который можно сразу переиспользовать. Изменённая страница переходит в Modified и после обратной записи в файл подкачки или соответствующий файл по мере необходимости переходит в повторно используемое состояние вроде Standby.
Включает ли «Доступно» диспетчера задач память Standby?
Да. Доступная физическая память, которую сообщает Windows, — сумма Standby, Free и Zeroed. Standby ещё держит старое содержимое, но поскольку её можно сразу отдать под другую цель, она считается доступной памятью.
Запись в файл подкачки начинается только после полного исчерпания RAM?
Нет. Windows в фоне записывает редко используемые изменённые страницы в зависимости от списка Modified и состояния доступной памяти. Это не простой механизм, который ждёт абсолютного исчерпания и затем вытесняет всё разом.
Отключение файла подкачки ускоряет Windows?
В общем случае так утверждать нельзя. Отключение снижает Commit Limit, затрудняет удаление редко используемых изменённых страниц из RAM и влияет на дампы сбоя системы. Обычно его оставляют системно управляемым и решают, измеряя пиковый Commit и требования к дампу.
Если есть сжатие памяти, файл подкачки не нужен?
Он не становится ненужным. Хранилище сжатия сжимает страницы в RAM, чтобы снизить ввод-вывод, но сжатые страницы всё равно занимают физическую память и не заменяют гарантию Commit. Выбор между сжатием и выгрузкой — динамическая политика диспетчера памяти.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог