更新履歴(7件・最終更新 2026年09月07日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 主張・コード・注意事項を維持し、全3回の読み順と、仮想メモリの割り当て・物理ページの状態遷移・共有とコピーオンライトの仕組みおよび観測方法を、小見出しと比較表で読みやすく整理した。 更新前のバージョンを見る (DOI: 10.5281/zenodo.22279004)
- `<details>` 要素の中のコード例が ``` の記号のまま表示されていた不具合を修正した。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの「ページファイルはシステムクラッシュダンプを前提とする」という関係の向きを逆にし、「システムクラッシュダンプがページファイル(または専用ダンプファイル)を前提とする」条件付きの関係に改めました。本文の説明は変えていません。
- 文章のリズムと段落構成を見直して読みやすくリライトし、仕組みの説明に図を追加しました。あわせて、変更済みプライベートページのページファイルへの書き戻しはページファイル構成時に限られ、無効時はRAMに留まり続けることを図とキャプションに明記しました。コードと参考リンクは変えていません。
- 初版公開
この記事を引用する(DOI: 10.5281/zenodo.22054248)
この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。
小村 豪(2026)「Windowsメモリの深層(第2回) ── 物理ページの一生:5つのリストとページファイルの真実」合同会社小村ソフト. https://doi.org/10.5281/zenodo.22054248 https://comcomponent.com/blog/windows-memory-internals-page-lifecycle-pagefile/
- DOI(最新版)
- 10.5281/zenodo.22054248
- DOI(この版)
- 10.5281/zenodo.22556624
「Working Setが減った。では、そのページはもうRAMにないのか」。第2回では、この疑問を物理ページの側から追います。
前回の「Windowsメモリの深層(第1回) ── 仮想アドレスが物理RAMに変わる瞬間」で見たのは、Commit済みページへの初回アクセスで物理ページを得るまででした。Working Setから外れた後も、そのページがすぐ消えたり、すぐページファイルへ移ったりするとは限りません。
変更されていないページは、内容を残してStandbyへ移れます。変更済みページは、まずModifiedで書き戻しを待ちます。再利用時にはFreeやZeroedを経由する場合があり、同じ内容が再び必要なら、Standbyからソフトフォルトで戻ることもできます。
本記事は、PFNデータベースを軸に、1枚の物理ページのActive・Modified・Standby・Free・Zeroedという状態をつなぐ解説です。数字の読み方は、導入編「Windowsの『メモリ使用量』は何を表しているのか」を前提にします。
「Windowsメモリの深層」全3回
本連載は、物理ページを得る → 常駐・回収の流れを追う → 共有と私有化を理解する、という順に進みます。
| 回 | テーマ | この回で追うこと |
|---|---|---|
| 第1回 | 仮想アドレスとページフォルト | VirtualAllocした領域が、いつ物理RAMを得るか |
| 第2回(本記事) | 物理ページの一生 | Working Setから外れたページの状態遷移と、ページファイルの役割 |
| 第3回 | セクションオブジェクトとコピーオンライト | DLL・ファイルマッピング・共有メモリが、どのように物理ページを共有するか |
第2回が答える疑問は、ただ1つです。
Working Setから外れた物理ページは、消えるのか、ディスクへ行くのか、それともRAMに残るのか。
| 読み始める前に | 内容 |
|---|---|
| 対象読者 | AvailableとStandbyの関係、Working Setトリミング後の挙動、ページファイル設定、メモリ圧縮を仕組みから理解したい開発者・運用担当者 |
| 前提環境 | Windows 10/11または現行のWindows Server |
| 前提知識 | Working Set、Commit、ソフト/ハードフォルトの基礎 |
| 難易度 | 中級。PFNやページリストという内部用語を扱う |
カーネルデバッガーなしでも、RAMMapとPerfMonで観測できる範囲を中心に説明します。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全18件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
1. まず結論
物理ページの行き先は、次の3点で整理できます。
- Working Setから外すことと、内容を失うことは別です。 cleanなページはStandbyに残り、同じ内容が必要ならディスクを読まずに戻れます。変更済みページは、ページファイルや対応ファイルなどに内容を保持できる状態にしてから再利用します。
- Standbyは、キャッシュであると同時にAvailableでもあります。 以前の内容を保ちますが、別用途で必要になれば再利用できるためです。AvailableにはStandby、Free、Zeroedが含まれます。1
- ページファイルは、書き出し先だけでなくCommitとダンプも支えます。 書き出しはRAMが完全に尽きてからの一括処理ではなく、Modifiedリストやメモリ圧力に応じてバックグラウンドで進みます。無効にしてもリークは直らず、Commit Limit、RAM再利用の選択肢、ダンプ取得能力を減らすことがあります。234
一文でまとめるなら、Windowsはページを捨てる前に、再び必要になる可能性と、元の内容を復元できる場所を確認している、ということです。
| 知りたいこと | 読む節 |
|---|---|
| Working Setから外れたページの行き先 | 2〜6節 |
| Standby・Free・Zeroedと圧縮の違い | 7〜8節 |
| ページファイルの要否・サイズを判断したい | 9〜10節 |
| RAMMapやTestlimitで確かめたい | 11〜12節 |
2. PFNデータベース ── 物理RAM側の台帳
第1回で見たPTEは、仮想ページから物理ページへの変換を表すものでした。これを物理ページの側から見て、「このRAMページは今、何に使われているか」を追う台帳がPFNデータベースです。PFNはPage Frame Numberの略で、物理RAMをページ単位に番号付けしたものです。
PFNエントリーは、概念的には次の情報を追跡しています。
- 物理ページの現在状態
- 参照数や共有数
- 対応するPTE
- 変更済みかどうか
- どのページリストに属するか
- NUMAノードや優先度に関わる情報
見る粒度に合わせて、ツールの表示を選びます。 WinDbgとRAMMapでは、次のように確認できます。567
| 確認したいこと | 表示・コマンド |
|---|---|
| 特定PFNの情報 | WinDbgの!pfn |
| 物理メモリの利用状況とページリストの集計 | WinDbgの!memusage |
| 用途とページリスト | RAMMapのUse Counts |
| 優先度別のStandby | RAMMapのPriority Summary |
| ページ単位の利用状況 | RAMMapのPhysical Pages |
RAMMapなら、カーネルデバッガーを使わずに観測できます。
3. 5つの状態を一枚につなぐ
ここでは、物理ページの流れを5状態に簡略化します。まずは「今使えるか」「内容を残しているか」「再利用前に準備が要るか」で読み分けてください。
| 状態 | この回での捉え方 |
|---|---|
| Active / Valid | 有効PTEを通じ、Working Setなどから参照中 |
| Modified | 変更済みで、書き戻しを待つ |
| Standby | 以前の内容を保った、再利用可能な候補 |
| Free | 割り当て可能だが、古いビット列が残り得る |
| Zeroed | ゼロ化され、新しいユーザーモードページとして渡せる |
これは全状態を列挙した図ではありません。 現行Windowsには優先度別Standby、Transition、Badなどもあります。また、Activeは単一の「Activeリスト」というより、有効PTEを通じて参照中の状態です。この区別を残したうえで、アプリのメモリ挙動を追うための図として使います。
図1: Working Setで参照中のページが、cleanならStandby、dirtyならModifiedへ移る。同じ内容なら復帰し、別用途なら直接再利用するか、ゼロが必要な割り当てに備えてFree/Zeroedを経由する。
図1のMermaidソース
flowchart LR
zeroed["Zeroed\nゼロ済み"] -->|初回Touch| active["Active / Valid\nWorking Setで参照中"]
active -->|cleanをトリム| standby["Standby\n内容を保った再利用候補"]
active -->|dirtyをトリム| modified["Modified\n書き戻し待ち"]
modified -->|書き戻し完了| standby
standby -->|ソフトフォルトで復帰| active
standby -->|古い識別を破棄| free["Free\n未ゼロ化"]
standby -->|別用途へ直接再利用| active
free -->|ゼロが必要な割り当て用| zeroed
図で押さえたいのは、次の2点です。
Working Setから外れても、内容まで失うとは限りません。 同じ内容が再び必要なら、残っているページへ戻れます。
別用途へ再利用する場合も、必ずFree/Zeroedを順番に通るわけではありません。 新しいデマンドゼロのプライベートページとしてユーザーモードへ渡すなら、古い内容を消す必要があります。一方、ファイル内容の読み込み先のようにページ全体を上書きする用途なら、Standbyの識別を外して直接再利用できます。
4. Active / Valid ── 今、参照できる物理ページ
Active/Validなページは、有効なPTEを通じてプロセスのWorking Setやシステム空間から参照されています。CPUは通常のアドレス変換で到達できるため、そのアクセス自体にページフォルトは不要です。
ただし、ページがActiveであり続けるという保証はありません。メモリマネージャーは利用可能メモリを維持するため、Working Setの大きさやページの最近の利用状況などを見て、候補ページをトリムします。MicrosoftのWorking Set解説も、利用可能メモリを作るためにメモリマネージャーがWorking Setからページを削除すると説明しています。8
4.1. トリムは解放ではない
Working Setトリミングで変わるのは、主に今すぐ有効PTEで参照できる常駐状態だけです。次の4つは、それぞれ別の出来事として区別してください。
- Working Setから外す
- Commitを解放する
- 仮想アドレス範囲を解放する
- 元データを失う
EmptyWorkingSetやツールの「Trim Working Set」を実行しても、VirtualFreeやヒープ解放の代わりにはなりません。同じページへ再び触れれば、Standbyからのソフトフォルト、またはバックストアからのハードフォルトで戻ってきます。したがって「Working Setを小さくできた」ことは、「リークを直した」ことを意味しません。
5. cleanページはStandbyへ行く
ページがWorking Setから外されても、内容が元ファイルと同じか、すでに安全なバックストアを持っているなら、Standbyへ置けます。代表例は次のとおりです。
- 変更されていないEXE/DLLのコード
- 変更されていないメモリマップトファイル
- 書き戻し済みのプライベートページ
- ファイルキャッシュに残るデータ
同じ内容へ戻すか、別用途へ回すか
Standbyページは、以前の内容との対応関係を保っています。同じプロセスや別プロセスがその内容を必要としたとき、まだ再利用されていなければ、PTEを再接続するソフトフォルトだけで戻せます。
一方で、別の割り当てが物理ページを必要とすれば、Standbyの古い識別を捨てて再利用できます。再利用先がゼロ初期化を必要とするユーザーモードのプライベートページならZeroedを用意しますが、ファイル内容などでページ全体を上書きする用途なら、ゼロ化せず直接再割り当てできます。
この二面性こそ、Standbyがキャッシュであり、Availableでもある理由です。
5.1. AvailableにStandbyが入る理由
MEMORYSTATUSEX.ullAvailPhysは、ディスクへ書き出さずに直ちに再利用できる物理メモリを表し、Standby、Free、Zeroedの合計です。1
flowchart LR
accTitle: Availableを構成する3つのページリスト
accDescr: 利用可能物理メモリはStandby、Free、Zeroedの合計で、Working Setから参照中のActiveページは含まれない
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で待つ
アプリがページへ書き込むと、その内容は元のバックストアと一致しなくなります。このdirtyページをそのまま別用途に上書きすると、データを失ってしまいます。そこで、Working Setから外された変更済みページは、Modifiedで書き戻しを待ちます。
書き戻し先は、ページの種類によって変わります。
| ページの種類 | 代表的な書き戻し先 |
|---|---|
| プライベートなCommit済みページ | ページファイル |
| 書き込み可能なマップドファイル | 対応するデータファイル |
| ファイルキャッシュのdirtyデータ | 対応するデータファイル |
| cleanなEXE/DLLページ | 書き戻し不要。元イメージから再読込可能 |
Microsoftのページファイル解説も、すでにディスク上に存在する.dll、.exe、通常ファイルはページファイルへ重ねて書く必要がなく、元のディスクコピーを持たない変更済みデータこそがページファイルの候補になると説明しています。3
6.1. Modified Page Writer
Modified Page Writerは、メモリマネージャーが追跡するページファイルバックのdirtyページを走査し、ページファイルへ書き出すシステムワーカーです。4 マップドファイル側にはMapped Page Writerなどの経路があり、ファイルシステムやキャッシュマネージャーと協調して対応ファイルへ書き戻します。
書き出しは、「RAMが0バイトになるまで何もしない」方式ではありません。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. ページ出力とページファイル固有のI/Oを分ける
カウンターは、I/Oの回数とページ数を分けて読みます。
| カウンター | 数えるもの |
|---|---|
Memory\\Page Writes/sec |
物理メモリを空けるために発行したページング書き込みI/Oの回数 |
Memory\\Pages Output/sec |
その書き込みでディスクへ出したページ数 |
Memory\\Page Reads/sec |
ハードフォルト解決のために発行したディスク読み取りI/Oの回数 |
Memory\\Pages Input/sec |
その読み取りでRAMへ入ったページ数 |
もう1つの区別は、ページングI/Oと、ページファイル固有のI/Oは同じではないという点です。
Page Writes/secとPages Output/secは、マップドファイルなどのdirtyページを書き戻す経路でも増え得ます。入力側も、ページファイル、DLL、EXE、メモリマップトファイルを区別しません。3
pagefile.sys固有のI/Oを特定するには、この4カウンターだけで推定せず、ETW/WPAでFile I/OとDisk I/Oを記録します。FileObjectとFileNameを対応付け、対象ファイルを確認してください。9
もう1つ付け加えると、ページファイルへ先に書いておくことは、すぐディスクから読み戻すことを意味しません。アクセスされなければ、書き戻し済みページをRAMから外し、より頻繁に使うページへ物理メモリを回せます。
7. Standby、Free、Zeroedの違い
7.1. Standby
以前の内容との対応関係を保持している状態です。
- 同じ内容が必要ならソフトフォルトで戻せる
- 別用途に必要なら古い識別を破棄して再利用できる
- 優先度別のStandbyリストがある
7.2. Free
以前の内容との有効な対応関係は失われ、割り当て可能な状態です。ただし、ページ内には古いビット列が残っている可能性があります。ユーザーモードへそのまま渡すと、以前のプロセスの情報を漏らす危険があります。
7.3. Zeroed
内容がゼロで、ユーザーモードの新規ページとして安全に渡せる状態です。第1回のデマンドゼロフォルトは、利用可能なZeroedページを得てPTEへ結ぶ代表例でした。FreeからZeroedへの準備は、需要とシステム状態に応じて行われます。
つまり「Free」と「Zeroed」は、どちらも空きに見えても、セキュリティ上の準備状態が違うのです。
8. メモリ圧縮ストア ── RAM内にもう1つの行き先を作る
Windows 10以降のメモリマネージャーは、メモリ圧力があるとき、使用頻度の低いページをすぐディスクへ書く代わりに、RAM内で圧縮できる場合があります。この圧縮ページの集合がcompression storeです。
8.1. 圧縮量をどこで見るか
Windows 10の初期実装では、圧縮ストアはSystemプロセスのWorking Set内に計上されていましたが、現行Windowsではデバッグツールのプロセス一覧に専用のMemory Compressionプロセスとして表示されます。したがって、現在の圧縮量を調べるときにSystemプロセスのWorking Setだけを追ってはいけません。より多くのアプリを物理メモリへ保ち、ディスクI/Oを減らすという目的自体は変わっていません。1011
8.2. 圧縮にもコストがあり、固定の順序ではない
ただし、次の点は押さえておいてください。
- 圧縮ページもRAMを使う
- 圧縮・展開にはCPUコストがある
- 圧縮してもCommitの約束は消えない
- 必ず「圧縮してからページファイル」という固定順序ではない
- ページの種類、圧力、アクセス履歴に応じて方針は変わる
タスクマネージャーの「使用中(圧縮)」は、圧縮によって物理メモリが完全に空いたという意味ではありません。圧縮ストアは、ページファイルを不要にする機能ではなく、RAMとストレージの間にCPUを使ってI/Oを減らす選択肢を1つ加えたものです。
9. ページファイルの本当の役割
ページファイルには、少なくとも3つの役割があります。
flowchart LR
accTitle: ページファイルの3つの役割
accDescr: ページファイルはCommit Limitを広げ、アクセス頻度の低い変更済みプライベートページのバックストアになり、システムクラッシュダンプの受け皿になる
pagefile["ページファイル"] --> limit["Commit Limitを広げる(上限側の余力)"]
pagefile --> backing["変更済みプライベートページのバックストア"]
pagefile --> dump["システムクラッシュダンプの受け皿"]
図4: ページファイルの役割は「遅いRAM」だけではない。使用量が0でも上限とダンプを支えている。
9.1. Commit Limitを広げる
システムのCommit Limitは、概ねRAMと全ページファイルの合計で決まります。ページファイルをなくすと、Commit Limitは搭載RAMより少し小さい水準まで下がります。Commit Totalが上限へ達すると新しいCommitが失敗し、アプリの異常終了やシステム不調につながり得ます。2
これは「今pagefile.sysへ何GB書いているか」とは別の話です。ページファイルは、Commitという約束を支える上限側の余力でもあるのです。
9.2. 変更済みプライベートページを支える
アクセス頻度の低い変更済みプライベートページをページファイルで支えれば、その物理ページをRAMから外し、頻繁に使うコードやデータへ回せます。2 ページファイルを無効にすると、こうしたページをRAMから外す選択肢が減ります。「ページアウトが起きないから速い」と単純には言えません。
9.3. システムクラッシュダンプを支える
システムクラッシュ時にMemory.dmpを作るには、選択したダンプ方式を支えられるページファイルまたは専用ダンプファイルが必要です。3 完全メモリダンプ、カーネルメモリダンプ、自動メモリダンプでは必要量が異なります。
クラッシュ調査を行う環境では、容量節約だけを理由にページファイルを消すと、最も必要なときに証拠が残らないことになりかねません。収集方式は「Windowsアプリのクラッシュダンプ収集入門」も参照してください。
10. 適正サイズは一律ではない
「RAMの1.5倍」といった固定式だけでページファイルのサイズを決めるべきではありません。Microsoftは、適正サイズが次の2点でシステムごとに異なり、一般化できないと説明しています。3
- ピーク時のSystem Commit Charge
- 必要なシステムクラッシュダンプ
実務では、次の順で考えます。
10.1. まずシステム管理を基準にする
Windowsの既定はシステム管理です。搭載RAM、Commitの需要、クラッシュダンプ要件などに応じて増減します。特別な制約や測定結果がないなら、ここから始めるのが安全です。
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が大量に待っているか、ディスクが飽和しているかを合わせて見ます。3
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内にあるファイルデータを追えます。
同じファイルを2回読み、残っているページを見る
- 大きめのローカルファイルを一度読みます。
- 読み取り処理を終了し、RAMMapをRefreshします。File SummaryやStandby側に、そのファイルのページが残っている場合があります。
- 同じファイルをもう一度読みます。まだ再利用されていないページは、ディスクI/Oなし、または少ないI/Oで復帰できます。
メモリ圧力、ウイルス対策、ファイルサイズによって結果は変わります。1回の数値よりも、状態遷移の方向を見てください。
Emptyは本番機の性能改善操作として使わない
なお、RAMMapのEmptyメニューはシステム状態を人為的に変えます。本番機の性能改善操作としてStandbyを消すのではなく、隔離した検証環境だけで使ってください。
11.2. TestlimitでCommitとTouchを分ける
Testlimitは、メモリ、ハンドル、プロセス、スレッドなどのリソース不足を模擬するSysinternalsツールです。まず、手元のバイナリで次を実行し、表示されるバージョンとusageを確認します。
.\\testlimit64.exe -?
バージョンと構文を確認してから試す
以下はTestlimit v5.24を対象にします。v5.24の公式構文では、-m [MB]が指定量のメモリ確保、-d [MB]が確保とTouch、-e [seconds]が割り当て間隔、-c [count]が割り当て回数です。-cは最後に指定します。手元の表示が異なる場合は、そのusageを優先してください。12
次に、使い捨てVMで小さく試します。
# -m 64: 64 MiBを確保、-e 1: 1秒間隔、-c 8: 8回で停止
.\\testlimit64.exe -m 64 -e 1 -c 8
# 同じ回数・間隔で、-dにより各領域をTouchする
.\\testlimit64.exe -d 64 -e 1 -c 8
実行中は、次を同時に記録します。
- Task Managerの「コミット済み X/Y」
- RAMMapのActive、Modified、Standby
Memory\\Committed BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\Modified Page List Bytes
枯渇の再現は、スナップショットを取ったVMだけで行う
Commit枯渇を実際に再現する場合は、ホストPCでは行わず、スナップショットを取ったVMで回数を段階的に増やしてください。上限まで自動で確保させる実行は、画面停止、プロセス異常終了、ログ欠損を起こし得ます。目的はOSを不安定にすることではなく、Commit Limitへ近づくと新規Commitが失敗することを観測することです。
12. 実務で避けたい4つの誤読
12.1. 「Standbyが多いからメモリリーク」
Standbyは再利用可能なキャッシュで、Availableに含まれます。リークは、プロセス固有Commitのベースラインや割り当て内訳が負荷終了後も増え続けるかどうかで判断します。
12.2. 「Working Setを削ればリークが直る」
トリムは常駐状態を変えるだけで、Commitや仮想割り当てを解放しません。再アクセスすればフォルトして戻ってきます。
12.3. 「ページファイル使用量が0なら不要」
ページファイルは現在の書き込み量だけでなく、Commit Limitとクラッシュダンプを支えています。平常時の使用量だけで削除を決めると、ピーク時の余力と障害時の証拠を失います。
12.4. 「メモリ圧縮が先、次に必ずページファイル」
圧縮は固定された直列パイプラインではありません。ページの種類、圧縮効率、CPU負荷、メモリ圧力、バックストアの有無に応じて、Windowsが動的に選びます。
13. まとめ
- PFNデータベースは、物理ページの所有、参照、変更、ページリスト状態を追う台帳です。
- Working Setから外れたcleanページはStandbyへ残り、同じ内容が必要ならソフトフォルトで復帰できます。8
- dirtyページはModifiedで待ち、プライベートページならページファイル、マップドページなら対応ファイルなどへ書き戻されます。4
- AvailableはStandby、Free、Zeroedの合計で、Standbyが多いこと自体はメモリ不足ではありません。1
- メモリ圧縮はRAM内でページを圧縮してI/Oを減らしますが、Commitとページファイルの役割を消しません。10
- ページファイルはCommit Limit、変更済みプライベートページ、システムクラッシュダンプを支えます。23
- 適正サイズはピークCommitとダンプ要件で決まり、一律の倍率では決められません。3
- Working SetトリミングやStandby消去は、メモリリーク修正ではありません。
続きは第3回「セクションオブジェクトとコピーオンライト:DLLとファイルマッピングの正体」です。
Standbyへ残るファイルページやDLLが、複数プロセスからなぜ同じ物理ページとして見えるのかを追います。
関連記事
- Windowsメモリの深層(第1回) ── 仮想アドレスが物理RAMに変わる瞬間
- Windowsの「メモリ使用量」は何を表しているのか
- Windows I/Oの深層(第4回) ── キャッシュマネージャーとWriteFile
- Windowsアプリのクラッシュダンプ収集入門
- Process Explorer / Handle / VMMap実践
関連する相談領域
合同会社小村ソフトでは、Windowsアプリケーションのメモリ圧迫、Commit枯渇、ページング、Working Set増加、クラッシュダンプ取得設計の調査を扱っています。
参考リンク
-
Microsoft Learn, MEMORYSTATUSEX structure.
ullAvailPhysがディスクへ書かず直ちに再利用できる物理メモリであり、Standby、Free、Zeroedリストの合計であることについて。 ↩ ↩2 ↩3 -
Microsoft Learn, Introduction to page files. ページファイルがアクセス頻度の低い変更済みページをRAMから外すこと、Commit Limitを広げること、システムクラッシュダンプを支えることについて。 ↩ ↩2 ↩3 ↩4
-
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
-
Microsoft Learn, Data corruption on IO write. Modified Page Writerがメモリマネージャーのシステムワーカーで、ページファイルバックのdirtyページを走査して書き出すことについて。 ↩ ↩2 ↩3
-
Microsoft Learn, !pfn (WinDbg). 指定したPFNエントリーの状態、参照、PTEアドレスなどを表示できることについて。 ↩
-
Microsoft Learn, !memusage (WinDbg). 物理メモリ利用とZeroed、Free、Standby、Modified、Activeなどのページ状態を集計できることについて。 ↩
-
Microsoft Learn, RAMMap - Sysinternals. RAMMapのUse Counts、Processes、Priority Summary、Physical Pages、File Summary、File Detailsが物理メモリの用途とページリストを表示することについて。 ↩ ↩2
-
Microsoft Learn, Working Set. メモリマネージャーが利用可能メモリを作るためWorking Setをトリミングすること、Transitionや他プロセスのWorking Setに残るページをソフトフォルトで解決できることについて。 ↩ ↩2
-
Microsoft Learn, FileIo_Name class. ETWのFile I/OイベントがFileObjectとFileNameを持ち、FileObjectをDisk I/Oイベントと対応付けて対象ファイルのI/Oを識別できることについて。 ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. Windows 10初期のcompression store実装がRAM内の圧縮ページ集合をSystemプロセスのWorking Setへ置き、ディスクへの書き出しを減らしたことについて。 ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. 現行のDebugging Tools for Windowsによるプロセス一覧例で、System配下に別PIDの
Memory Compressionプロセスが表示されることについて。 ↩ -
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の仮想メモリと物理メモリの関係、ページファイルの役割、メモリ不足やリーク調査で見るべき指標を解説します。
Windowsメモリの深層(第1回) ── 仮想アドレスが物理RAMに変わる瞬間:ページフォルトの一部始終
VirtualAlloc、VAD、ページテーブル、TLB、デマンドゼロ、ハードフォルトをつなぎ、仮想アドレスが物理RAMへ割り当てられる瞬間を解説します。
Windowsメモリの深層(第3回) ── セクションオブジェクトとコピーオンライト:DLLとファイルマッピングの正体
セクションオブジェクト、イメージ/データマッピング、共有キャッシュ、コピーオンライトをつなぎ、DLLや共有メモリが物理ページを共有する仕組みを解説します。
MS14-068で普通のユーザーが管理者になれた理由 ── KerberosのPACと署名検証
MS14-068(CVE-2014-6324)では、一般ユーザーが偽ったグループ情報をKDCが受け入れ、ドメイン管理者として扱われ得ました。PAC、鍵付き署名とチェックサムの違い、権限への反映、修正と検知の限界を解説します。
CurveBall――偽の証明書を、なぜWindowsが信頼してしまったのか? ── CryptoAPIと楕円曲線のパラメーター
CurveBall(CVE-2020-0601)は、偽の証明書を信頼された認証局のものと取り違えるWindowsの脆弱性でした。公開鍵の点と基準点の関係から、署名の計算が正しくても信頼の判定が崩れる理由を解説します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- Working Setから外れたページは、すぐページファイルへ書かれますか?
- いいえ。変更されていないページは内容を保ったままStandbyへ移り、すぐ再利用できるキャッシュになります。変更済みページはModifiedへ移り、必要に応じてページファイルまたは対応するファイルへ書き戻された後、Standbyなどの再利用可能な状態へ進みます。
- タスクマネージャーのAvailableにはStandbyメモリが含まれますか?
- 含まれます。Windowsが報告する利用可能物理メモリは、Standby、Free、Zeroedの合計です。Standbyは古い内容を保持していますが、必要なら即座に別用途へ再利用できるため、利用可能メモリとして数えられます。
- ページファイルへの書き出しは、RAMが完全に尽きてから始まりますか?
- いいえ。WindowsはModifiedリストや利用可能メモリの状態に応じ、アクセス頻度の低い変更済みページをバックグラウンドで書き戻します。絶対的な枯渇を待って一斉に退避する単純な仕組みではありません。
- ページファイルを無効にするとWindowsは速くなりますか?
- 一般には速くなると断定できません。無効化するとCommit Limitが下がり、アクセス頻度の低い変更済みページをRAMから外しにくくなり、システムクラッシュダンプにも影響します。通常はシステム管理のまま、ピークCommitとダンプ要件を測って判断します。
- メモリ圧縮があればページファイルは不要ですか?
- 不要にはなりません。圧縮ストアはRAM内でページを圧縮してI/Oを減らす仕組みですが、圧縮ページも物理メモリを使い、Commitの保証を置き換えません。圧縮とページアウトの選択はメモリマネージャーの動的な方針です。