Глубины памяти Windows (часть 2) — жизненный цикл физической страницы: пять списков и файл подкачки
· Обновлено: · Go Komura · Windows, Управление памятью, Файл подкачки, Working Set, Standby, RAMMap, Мониторинг производительности
История изменений (2 обновлений, последнее 3 Sep 2026)
Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.
- Исправлен дефект отображения: примеры кода внутри элемента `<details>` показывались как необработанная разметка ```.
- Русский текст переписан по текущему навыку технического перевода как полный перевод японского оригинала.
- Первая публикация
Цитирование статьи(DOI: 10.5281/zenodo.22176120)
Статья заархивирована на Zenodo. Ниже приведены DOI, который всегда ведёт к последней версии, и DOI, закреплённый за версией, которую вы читаете.
Go Komura (2026). Глубины памяти Windows (часть 2) — жизненный цикл физической страницы: пять списков и файл подкачки. KomuraSoft LLC. https://doi.org/10.5281/zenodo.22176120 https://comcomponent.com/ru/blog/windows-memory-internals-page-lifecycle-pagefile/
- DOI (последняя версия)
- 10.5281/zenodo.22176120
- DOI (эта версия)
- 10.5281/zenodo.22279060
В предыдущей статье «Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической RAM» мы дошли до того, как обработчик ошибки страницы выделяет физическую страницу при первом обращении к странице, для которой уже выполнен Commit. Куда же эта физическая страница уходит после того, как её убрали из Working Set?
Часто всё сводят к фразе «её вытесняют в файл подкачки», но до и после этого есть несколько состояний. Неизменённую страницу можно перевести в Standby, сохранив содержимое. Изменённая страница сначала ждёт записи на диск в Modified. При повторном использовании она может пройти через Free или Zeroed, а если снова нужно то же содержимое — вернуться из Standby мягкой ошибкой страницы (soft fault).
В этой статье ось — база данных PFN: как одна физическая страница переходит между Active, Modified, Standby, Free и Zeroed. Как читать сами цифры, объясняется во вводной статье «Как читать «использование памяти» в Windows: Working Set, Private Bytes, Commit и файл подкачки».
«Глубины памяти Windows» — все 3 части
- Часть 1: виртуальные адреса и ошибки страниц
Когда виртуальная страница, для которой уже выполнен Commit, получает физическую RAM. - Часть 2 (эта статья): жизненный цикл физической страницы
Переходы состояний страницы, которую убрали из Working Set, и роль файла подкачки. - Часть 3: объекты секций и копирование при записи
Как DLL, проецирование файлов и общая память разделяют физические страницы.
Вопрос, на который отвечает часть 2, один.
Физическая страница, которую убрали из Working Set, исчезает, уходит на диск или остаётся в RAM?
Кому это нужно: разработчикам и тем, кто сопровождает системы, и хочет понять устройство, а не только симптомы: почему Available велик и Standby тоже велик, что происходит после обрезки Working Set, как задавать файл подкачки и как работает сжатие памяти. Среда: Windows 10/11 или актуальный Windows Server. Предпосылки: Working Set, Commit, мягкие и жёсткие ошибки страниц. Сложность средняя. Внутренние термины вроде PFN и списков страниц используются, но в центре — то, что можно увидеть в RAMMap и PerfMon без отладчика ядра.
На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 18, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle
1. Сначала выводы
Для начала — пункты, которые чаще всего читают неверно.
- Страница, которую убрали из Working Set, не обязательно сразу исчезает.
Clean-страница остаётся в Standby и может вернуться без чтения диска, если снова нужно то же содержимое. - Изменённую страницу нельзя сразу отдать под другую задачу.
Приватное содержимое сначала делают пригодным к повторному использованию: записывают в файл подкачки; страницу проецируемого файла — в соответствующий файл; и только после этого страницу можно забрать. - Available включает Standby.
Standby — это кэш, который ещё держит содержимое, и одновременно кандидат на повторное использование, который можно сразу забрать.1 - Запись в файл подкачки — не пакетная операция, которая стартует только после полного исчерпания RAM.
Она идёт в фоне в зависимости от списка Modified и давления на память.23 - Файл подкачки — не просто «медленная RAM».
Он расширяет Commit Limit, служит backing store для изменённых приватных страниц и обеспечивает crash dump системы.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. Даже так схема достаточно полезна, чтобы читать поведение памяти приложения.
Рис. 1: Страницу, на которую ссылаются в Working Set, переводят в Standby, если она clean, и в Modified, если dirty. То же содержимое можно вернуть; под другую задачу страницу либо сразу переиспользуют, либо проводят через Free/Zeroed, если выделение требует нулей.
Исходник Mermaid для рис. 1
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 -->|Возврат мягкой ошибкой| 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. Clean-страница идёт в Standby
Даже после удаления из Working Set страницу можно поместить в Standby, если содержимое всё ещё совпадает с исходным файлом или у неё уже есть безопасный backing store. Типичные примеры:
- Неизменённый код EXE/DLL
- Неизменённый файл, проецируемый в память
- Приватная страница, уже записанная на диск
- Данные, оставшиеся в файловом кэше
Страница Standby сохраняет соответствие прежнему содержимому. Когда тот же процесс или другой снова нуждается в этом содержимом, и страницу ещё не забрали, достаточно мягкой ошибки, которая заново подключает PTE.
С другой стороны, если другое выделение нуждается в физической странице, старую привязку Standby можно сбросить и страницу переиспользовать. Если место назначения — приватная страница пользовательского режима, которой нужно обнуление, готовят Zeroed. Если страницу целиком перезапишут содержимым файла, её можно сразу переназначить без обнуления.
Эта двойственность и есть причина, почему Standby — и кэш, и часть Available.
5.1. Почему Available включает Standby
MEMORYSTATUSEX.ullAvailPhys — физическая память, которую можно сразу переиспользовать без записи на диск: сумма Standby, Free и Zeroed.1
flowchart LR
accTitle: Три списка страниц, из которых состоит Available
accDescr: Доступная физическая память — сумма Standby, Free и Zeroed; страницы Active, на которые ссылаются в Working Set, не входят
standby["Standby (кандидат на повторное использование с сохранённым содержимым)"] --> avail["Available (доступная физическая память)"]
free["Free (свободна, не обнулена)"] --> avail
zeroed["Zeroed (свободна и обнулена)"] --> avail
active["Active (на неё ссылаются в Working Set)"] -.->|Не входит| avail
Рис. 2: Available — сумма Standby, Free и Zeroed. Standby, которая ещё держит содержимое, тоже считается «доступной».
Поэтому нет противоречия, когда диспетчер задач показывает: «Free мало, зато Cached/Standby много, а Available достаточно». Windows не оставляет свободную RAM простой: недавно использованные файлы и код остаются в Standby, чтобы при необходимости быстро отдать их как кэш, и забираются, если нужна другая задача.
Не заключайте «Free мало — значит сразу нехватка памяти». Смотрите вместе Available, Commit, жёсткие ошибки страниц и задержку обработки.
6. Dirty-страница ждёт в Modified
Когда приложение пишет в страницу, содержимое перестаёт совпадать с исходным backing store. Если такую dirty-страницу сразу перезаписать под другую задачу, данные пропадут. Поэтому изменённую страницу, которую убрали из Working Set, ставят в Modified и ждут записи на диск.
Куда писать, зависит от вида страницы.
| Вид страницы | Типичное место записи |
|---|---|
| Приватная страница с Commit | Файл подкачки |
| Проецируемый файл с правом записи | Соответствующий файл данных |
| Dirty-данные в файловом кэше | Соответствующий файл данных |
| Clean-страница EXE/DLL | Запись не нужна. Можно снова прочитать из исходного образа |
Документация Microsoft по файлу подкачки тоже объясняет: .dll, .exe и обычные файлы, которые уже есть на диске, незачем писать ещё и в файл подкачки; кандидатами в файл подкачки становятся изменённые данные, у которых нет исходной копии на диске.2
6.1. Modified Page Writer
Modified Page Writer — системный рабочий поток, который сканирует dirty-страницы с backing в файле подкачки, которые отслеживает диспетчер памяти, и пишет их в файл подкачки.3 На стороне проецируемых файлов есть пути вроде Mapped Page Writer: они вместе с файловой системой и диспетчером кэша пишут обратно в соответствующий файл.
Важно: запись — не схема «ничего не делать, пока RAM не станет 0 байт». Windows в фоне готовит страницы, которые потом можно будет переиспользовать, в зависимости от списка Modified, Available, состояния файла подкачки и тому подобного. Когда запись закончена и других действительных ссылок нет, страница с сохранённым содержимым переходит в Standby.
flowchart TB
accTitle: Пути записи изменённой страницы на диск
accDescr: Изменённая страница, которую убрали из Working Set, ждёт в списке Modified; для приватной страницы при настроенном файле подкачки Modified Page Writer пишет её в файл подкачки, а страницу проецируемого файла записывает Mapped Page Writer или подобный путь в соответствующий файл данных, затем страница переходит в Standby с сохранённым содержимым
dirty["Изменённая страница, которую убрали из Working Set"] --> modified["Ожидание записи на диск в списке Modified"]
modified -->|"Приватная страница (файл подкачки настроен)"| mpw["Modified Page Writer пишет в файл подкачки"]
modified -->|Страница проецируемого файла| mapped["Mapped Page Writer или подобный путь пишет в соответствующий файл"]
mpw --> standby["После записи — в Standby с сохранённым содержимым"]
mapped --> 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 не выделяют только файл подкачки. Они могут расти и на пути записи dirty-страниц с файловым 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 вместо того, чтобы сразу писать их на диск. Это множество сжатых страниц и есть compression store (хранилище сжатия).
В ранней реализации Windows 10 хранилище сжатия учитывалось внутри Working Set процесса System, но в актуальном Windows в списках процессов отладчика оно видно как отдельный процесс Memory Compression. Поэтому, оценивая текущий объём сжатия, не смотрите только Working Set процесса System. Сама цель — удержать больше приложений в физической памяти и снизить дисковый ввод-вывод — не изменилась.1011
Имейте в виду следующее.
- Сжатые страницы всё равно занимают RAM
- Сжатие и распаковка стоят циклов ЦП
- Сжатие не отменяет обещание Commit
- Нет фиксированного порядка «всегда сначала сжать, потом файл подкачки»
- Политика меняется в зависимости от вида страницы, давления и истории доступа
«Используется (сжато)» в диспетчере задач не значит, что сжатие полностью освободило физическую память. Хранилище сжатия не делает файл подкачки ненужным: между RAM и накопителем появляется ещё один вариант — потратить ЦП, чтобы снизить ввод-вывод.
9. Настоящая роль файла подкачки
У файла подкачки как минимум три роли.
flowchart LR
accTitle: Три роли файла подкачки
accDescr: Файл подкачки расширяет Commit Limit, служит backing store для редко используемых изменённых приватных страниц и принимает crash dump системы
pagefile["Файл подкачки"] --> limit["Расширяет Commit Limit (запас по верхней границе)"]
pagefile --> backing["Backing store изменённых приватных страниц"]
pagefile --> dump["Приёмник crash dump системы"]
Рис. 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. Обеспечить crash dump системы
Чтобы при аварийном отказе системы получить Memory.dmp, нужен файл подкачки или отдельный файл дампа, способный выдержать выбранный тип дампа.2 Полный дамп памяти, дамп памяти ядра и автоматический дамп памяти требуют разный объём.
В среде, где разбирают сбои, удалять файл подкачки только ради места на диске — риск остаться без улик, когда они нужнее всего. О способах сбора см. также «Сбор дампов сбоев Windows — введение: WER, ProcDump, WinDbg».
10. Подходящий размер не один на все системы
Размер файла подкачки не стоит задавать только формулой вроде «1,5 × RAM». Microsoft объясняет, что подходящий размер различается по системам по двум пунктам и не обобщается.2
- Пиковый System Commit Charge
- Нужный crash dump системы
На практике думайте в таком порядке.
10.1. Начать с системно управляемого размера
По умолчанию Windows сама управляет размером. Он растёт и сжимается в зависимости от установленной RAM, спроса на Commit, требований к crash dump и тому подобного. Без особого ограничения или результата измерения начинать отсюда безопасно.
10.2. Измерить пиковый Commit на характерной нагрузке
Собирайте следующие счётчики в PerfMon в течение долгого периода.
Memory\\Committed BytesMemory\\Commit LimitMemory\\% Committed Bytes In UseMemory\\Modified Page List BytesPaging File(*)\\% UsageMemory\\Available MBytesMemory\\Page Reads/secMemory\\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, который имитирует нехватку ресурсов: памяти, дескрипторов, процессов, потоков и тому подобного. Сначала выполните следующее против имеющегося двоичного файла и посмотрите отображаемые версию и usage.
.\\testlimit64.exe -?
Далее — Testlimit v5.24. В официальном синтаксисе v5.24 -m [MB] выделяет указанный объём памяти, -d [MB] выделяет и делает Touch, -e [seconds] — интервал выделения, -c [count] — число выделений. -c указывайте последним. Если локально видно иначе, ориентируйтесь на тот usage.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 BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\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, и crash dump. Решать удаление только по повседневному использованию — потерять запас на пике и улики в момент отказа.
12.4. «Сначала сжатие памяти, затем всегда файл подкачки»
Сжатие — не фиксированный последовательный конвейер. Windows выбирает динамически в зависимости от вида страницы, эффективности сжатия, нагрузки ЦП, давления на память и наличия backing store.
13. Итог
- База данных PFN — таблица учёта, которая отслеживает владение физической страницей, ссылки, изменение и состояние списка.
- Clean-страница, которую убрали из Working Set, остаётся в Standby и может вернуться мягкой ошибкой, если нужно то же содержимое.8
- Dirty-страница ждёт в Modified и записывается в файл подкачки, если приватная, или в соответствующий файл, если проецируемая.3
- Available — сумма Standby, Free и Zeroed; большой Standby сам по себе не нехватка памяти.1
- Сжатие памяти сжимает страницы внутри RAM, чтобы снизить ввод-вывод, но не отменяет роли Commit и файла подкачки.10
- Файл подкачки поддерживает Commit Limit, изменённые приватные страницы и crash dump системы.42
- Подходящий размер определяется пиковым Commit и требованиями к дампу; его нельзя задать единым множителем.2
- Обрезка Working Set и очистка Standby — не исправление утечки памяти.
Продолжение — часть 3, «Объекты секций и копирование при записи: чем на самом деле являются DLL и проецирование файлов».
Там разберём, почему файловые страницы и DLL, оставшиеся в Standby, видны нескольким процессам как одна и та же физическая страница.
Похожие статьи
- Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической RAM
- Как читать «использование памяти» в Windows: Working Set, Private Bytes, Commit и файл подкачки
- Глубины ввода-вывода Windows (часть 4) — диспетчер кэша: когда ваш WriteFile доходит до диска
- Сбор дампов сбоев Windows — введение: WER, ProcDump, WinDbg
- Process Explorer / Handle / VMMap на практике
Смежные области консультаций
KomuraSoft LLC занимается разбором давления на память в Windows-приложениях, исчерпания Commit, подкачки, роста Working Set и проектирования сбора crash dump.
- Разработка Windows-приложений
- Разбор сбоев и поиск причин
- Миграция и развитие существующих систем
- Связаться с нами
Справочные ссылки
-
Microsoft Learn, MEMORYSTATUSEX structure. О том, что
ullAvailPhys— физическая память, которую можно сразу переиспользовать без записи на диск, и что это сумма списков Standby, Free и Zeroed. ↩ ↩2 ↩3 -
Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. О том, что подходящий размер зависит от пикового Commit и требований к crash dump и не обобщается; список Modified, использование файла подкачки, связанные счётчики и системно управляемый файл подкачки. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Data corruption on IO write. О том, что Modified Page Writer — системный рабочий поток диспетчера памяти, который сканирует dirty-страницы с backing в файле подкачки и записывает их. ↩ ↩2 ↩3
-
Microsoft Learn, Introduction to page files. О том, что файл подкачки убирает редко используемые изменённые страницы из RAM, расширяет Commit Limit и обеспечивает crash dump системы. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, !pfn (WinDbg). О том, что можно показать состояние, ссылки, адрес PTE и другое указанной записи PFN. ↩
-
Microsoft Learn, !memusage (WinDbg). О том, что можно суммировать использование физической памяти и состояния страниц вроде Zeroed, Free, Standby, Modified и Active. ↩
-
Microsoft Learn, RAMMap - Sysinternals. О том, что Use Counts, Processes, Priority Summary, Physical Pages, File Summary и File Details в RAMMap показывают назначение физической памяти и списки страниц. ↩ ↩2
-
Microsoft Learn, Working Set. О том, что диспетчер памяти обрезает Working Set, чтобы создать доступную память, и что страницы, оставшиеся в Transition или в Working Set другого процесса, можно разрешить мягкой ошибкой страницы. ↩ ↩2
-
Microsoft Learn, FileIo_Name class. О том, что события File I/O ETW имеют FileObject и FileName, так что FileObject можно сопоставить с событиями Disk I/O, чтобы выделить ввод-вывод целевого файла. ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. О ранней реализации хранилища сжатия Windows 10, которая помещала множество сжатых страниц в RAM в Working Set процесса System и снижала записи на диск. ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. О примерах списков процессов актуальных Debugging Tools for Windows, где под System показан процесс
Memory Compressionс отдельным PID. ↩ -
Microsoft Learn, Testlimit - Sysinternals. Об официальном синтаксисе Testlimit v5.24, где
-mвыделяет память,-dвыделяет и делает Touch,-e— интервал выделения,-c— число выделений, причём-cуказывают последним. ↩
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Как читать «использование памяти» в Windows: Working Set, Private Bytes, Commit и файл подкачки
Столбец «Память» в диспетчере задач, Working Set, Private Bytes и Commit — это разные величины. Разбираем связь виртуальной и физической ...
Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической ОЗУ: ошибка страницы от начала до конца
Связываем VirtualAlloc, VAD, таблицы страниц, TLB, demand-zero и жёсткие ошибки страниц и разбираем момент, когда виртуальному адресу наз...
Глубины памяти Windows (часть 3) — объекты секций и копирование при записи: как устроены DLL и проецирование файлов
Разбираем объекты секций, проецирование образа и данных, общий кэш и копирование при записи: как DLL и общая память делят одни и те же фи...
Как ярлык Windows находит перемещённый файл? — Местоположение файла и его идентичность — разные вещи
Почему ярлык по-прежнему открывает перемещённый файл? Windows ищет цель не только по сохранённому пути, но и по идентификаторам отслежива...
Нужно ли по-прежнему «безопасно извлекать» USB-накопитель? — взгляд через быстрое удаление и кэш записи
Копирование закончилось — можно ли сразу вынуть USB-накопитель? Разбираем кэш записи и разницу между «быстрым удалением» и «повышенной пр...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Страница сразу записывается в файл подкачки, как только её убрали из Working Set?
- Нет. Неизменённая страница переходит в Standby, сохраняя содержимое, и становится кэшем, который можно сразу использовать повторно. Изменённая страница попадает в Modified и после записи в файл подкачки или в соответствующий файл — когда это нужно — переходит в повторно используемое состояние, например в Standby.
- Входит ли память Standby в «Доступно» диспетчера задач?
- Да. Доступная физическая память, которую сообщает Windows, — сумма Standby, Free и Zeroed. Standby ещё держит старое содержимое, но её можно сразу отдать под другую задачу, поэтому её считают доступной.
- Запись в файл подкачки начинается только когда RAM полностью исчерпана?
- Нет. Windows в фоне записывает на диск редко используемые изменённые страницы в зависимости от списка Modified и состояния доступной памяти. Это не механизм, который ждёт полного исчерпания и затем вытесняет всё разом.
- Windows станет быстрее, если отключить файл подкачки?
- В общем случае так утверждать нельзя. Отключение снижает Commit Limit, мешает убирать из RAM редко используемые изменённые страницы и влияет на crash dump системы. Обычно размер оставляют системно управляемым и решение принимают, измерив пиковый Commit и требования к дампу.
- Если есть сжатие памяти, файл подкачки не нужен?
- Нет, ненужным он не становится. Хранилище сжатия сжимает страницы внутри RAM, чтобы снизить ввод-вывод, но сжатые страницы по-прежнему занимают физическую память и не подменяют гарантию Commit. Выбор между сжатием и выгрузкой — динамическая политика диспетчера памяти.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.