Windows 記憶體的深層(第2回) ── 實體分頁的一生:五份清單與分頁檔的真相

· 更新日期: · · Windows, 記憶體管理, 分頁檔, Working Set, Standby, RAMMap, 效能監視

更新紀錄(1 筆,最後更新 2026年09月03日)

本文的修改紀錄。已保存的更新前版本,可透過附有 DOI 的永久連結閱讀。

修正了 `<details>` 元素內的程式碼範例以 ``` 原始記號顯示的問題。 查看更新前的版本 (DOI: 10.5281/zenodo.22176129)
初次發布
引用本文(DOI(已登錄存檔): 10.5281/zenodo.22176128)

以下 DOI 指向先前登錄的存檔,內容可能與目前正文不同。引用目前正文時,請使用本頁網址。

Go Komura(2026)。〈Windows 記憶體的深層(第2回) ── 實體分頁的一生:五份清單與分頁檔的真相〉。小村軟體有限公司。 https://comcomponent.com/zh-TW/blog/windows-memory-internals-page-lifecycle-pagefile/

DOI(已登錄存檔)
10.5281/zenodo.22176128
DOI(上次登錄版本)
10.5281/zenodo.22279046

「Working Set 變小了,那些分頁是不是已經不在 RAM 裡了?」第2回就從實體分頁這一側來追這個疑問。

上一篇「Windows 記憶體的深層(第1回) ── 虛擬位址變成實體 RAM 的瞬間」看到的,是已 Commit 的分頁在首次存取時取得實體分頁為止。離開 Working Set 之後,那張分頁不一定會立刻消失,也不一定會立刻移到分頁檔。

未修改的分頁可以帶著內容移到 Standby。已修改的分頁會先在 Modified 等待寫回。重複使用時可能經過 Free 或 Zeroed;若再次需要同一份內容,也可以從 Standby 以軟性分頁錯誤取回。

本文以 PFN 資料庫為軸,串起 一張實體分頁在 Active、Modified、Standby、Free、Zeroed 之間的狀態。數字本身怎麼讀,以入門篇「Windows 的「記憶體使用量」代表什麼 ── 正確解讀 Working Set、Private Bytes、Commit 與分頁檔」為前提。

「Windows 記憶體的深層」全 3 回

本系列依照 取得實體分頁 → 追蹤常駐與回收的流程 → 理解共用與私有化 的順序展開。

篇次 主題 本回要追的內容
第1回 虛擬位址與分頁錯誤 VirtualAlloc 配置的區域何時取得實體 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. 先講結論

實體分頁的去向,可以用下面三點整理。

  1. 從 Working Set 移出,和失去內容是兩回事。 乾淨的分頁留在 Standby,若需要同一份內容,不必讀磁碟就能取回。已修改的分頁要先讓內容能保存在分頁檔或對應檔案等位置,才會被重複使用。
  2. Standby 既是快取,同時也是 Available。 因為它保留著先前的內容,但其他用途需要時就能被拿去重複使用。Available 包含 Standby、Free、Zeroed。1
  3. 分頁檔支撐的不只是寫出目的地,還有 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. 把五種狀態畫在同一張圖上

這裡把實體分頁的流動簡化成五種狀態。請先用「現在能不能用」「有沒有留著內容」「重複使用前需不需要準備」來分辨。

狀態 本回的理解方式
Active / Valid 透過有效 PTE,正被 Working Set 等參照
Modified 已修改,等待寫回
Standby 保留著先前的內容,可重複使用的候選
Free 可以配置,但可能殘留舊的位元樣式
Zeroed 已歸零,可以當成新的使用者模式分頁交出

這不是列出所有狀態的圖。 現行 Windows 還有依優先順序區分的 Standby、Transition、Bad 等。而且 Active 與其說是單一的「Active 清單」,不如說是透過有效 PTE 正被參照的狀態。保留這些區別之後,再把這張圖當成追蹤應用程式記憶體行為的工具。

Windows 的實體分頁在 Active、Modified、Standby、Free、Zeroed 之間移動的簡化圖

圖 1:在 Working Set 中被參照的分頁,乾淨就移到 Standby,髒就移到 Modified。內容相同就回來;改作他用時,可以直接重複使用,或為了需要全零的配置而經過 Free/Zeroed。

圖 1 的 Mermaid 原始碼
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,不代表連內容也失去。 若再次需要同一份內容,可以回到還留著的那張分頁。

就算要改作他用,也不一定會依序經過 Free/Zeroed。 若要當成新的 demand-zero 私有分頁交給使用者模式,就必須清掉舊內容。反過來說,如果是像檔案內容的讀取目的地那樣整頁都會被覆寫的用途,只要拿掉 Standby 的識別就能直接重複使用。

4. Active / Valid ── 現在就能參照的實體分頁

Active/Valid 的分頁,透過有效的 PTE 被處理程序的 Working Set 或系統空間參照。CPU 用一般的位址轉譯就能到達,因此這次存取本身不需要分頁錯誤。

不過,並不保證分頁會一直維持 Active。為了維持可用記憶體,記憶體管理員會看 Working Set 的大小、分頁最近的使用狀況等,修剪候選分頁。Microsoft 的 Working Set 說明也提到,記憶體管理員會從 Working Set 移除分頁,以騰出可用記憶體。8

4.1. 修剪不等於釋放

Working Set 修剪改變的,主要只有 現在就能以有效 PTE 參照的常駐狀態。下面四件事請當成各自不同的事件來區分。

  • 從 Working Set 移出
  • 釋放 Commit
  • 釋放虛擬位址範圍
  • 失去原始資料

執行 EmptyWorkingSet 或工具的「Trim Working Set」,都不能取代 VirtualFree 或堆積釋放。再次碰到同一張分頁時,它會以來自 Standby 的軟性分頁錯誤,或來自後備存放區的硬性分頁錯誤回來。所以「Working Set 變小了」並不等於「洩漏修好了」。

5. 乾淨的分頁會去 Standby

即使分頁被移出 Working Set,只要內容與原始檔案相同,或已經擁有安全的後備存放區,就可以放到 Standby。代表性的例子如下。

  • 未修改的 EXE/DLL 程式碼
  • 未修改的記憶體對應檔案
  • 已經寫回的私有分頁
  • 留在檔案快取中的資料

是還原成同一份內容,還是改作他用

Standby 分頁保留著與先前內容的對應關係。同一個處理程序或其他處理程序需要那份內容時,只要它還沒被重複使用,一次重新接上 PTE 的軟性分頁錯誤就能取回。

另一方面,若有別的配置需要實體分頁,也可以丟掉 Standby 的舊識別再重複使用。若重複使用的對象是需要歸零初始化的使用者模式私有分頁,就會準備 Zeroed;若是用檔案內容等整頁覆寫的用途,則不必歸零就能直接重新指派。

正是這種兩面性,讓 Standby 既是快取,也是 Available。

5.1. Available 為什麼包含 Standby

MEMORYSTATUSEX.ullAvailPhys 代表不必寫出到磁碟就能立刻重複使用的實體記憶體,也就是 Standby、Free、Zeroed 的總和。1

構成 Available 的三份分頁清單可用實體記憶體是 Standby、Free、Zeroed 的總和,Working Set 中正被參照的 Active 分頁不包含在內不包含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 等待

應用程式寫入分頁之後,內容就和原本的後備存放區不一致了。若把這張髒分頁直接拿去覆寫作別的用途,資料就會遺失。因此,被移出 Working Set 的已修改分頁會在 Modified 等待寫回。

寫回的目的地依分頁種類而不同。

分頁種類 典型的寫回目的地
私有的已 Commit 分頁 分頁檔
可寫入的對應檔案 對應的資料檔
檔案快取中的髒資料 對應的資料檔
乾淨的 EXE/DLL 分頁 不必寫回。可從原始映像重新讀取

Microsoft 的分頁檔說明也提到,磁碟上已經存在的 .dll、.exe 與一般檔案不必再重複寫進分頁檔;沒有原始磁碟複本的已修改資料,才是分頁檔的候選。3

6.1. Modified Page Writer

Modified Page Writer 是系統工作執行緒,會掃描記憶體管理員追蹤、以分頁檔為後備的髒分頁,並寫出到分頁檔。4 對應檔案那一側則有 Mapped Page Writer 等路徑,會與檔案系統、快取管理員協同,把內容寫回對應的檔案。

寫出並不是「等到 RAM 剩 0 位元組才開始動作」的做法。它會依 Modified 清單、Available、分頁檔的狀態等,在背景先準備好將來可以重複使用的分頁。

只要寫回完成,而且沒有其他有效參照,分頁就能帶著內容前往 Standby。

已修改分頁的寫回路徑離開 Working Set 的已修改分頁會在 Modified 清單等待;私有分頁在已設定分頁檔時由 Modified Page Writer 寫入分頁檔,對應檔案的分頁則由 Mapped Page Writer 等寫回對應的資料檔,完成後帶著內容前往 Standby私有分頁(已設定分頁檔時)對應檔案的分頁離開 Working Set 的已修改分頁在 Modified 清單等待寫回Modified Page Writer 寫出到分頁檔Mapped Page Writer 等寫回對應檔案寫回完成後,帶著內容前往 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 的分頁數

另一個要區分的是,分頁 I/O 和分頁檔專屬的 I/O 並不相同。

Page Writes/sec 與 Pages Output/sec 在寫回對應檔案等髒分頁的路徑上也可能上升。輸入側同樣不區分分頁檔、DLL、EXE 與記憶體對應檔案。3

要確定 pagefile.sys 專屬的 I/O,不要只用這四個計數器推估,而是用 ETW/WPA 記錄 File I/O 與 Disk I/O。請把 FileObject 與 FileName 對應起來,確認目標檔案。9

再補充一點:先寫進分頁檔,並不代表馬上就要從磁碟讀回來。若之後沒有被存取,就可以把已寫回的分頁從 RAM 移出,把實體記憶體挪給更常使用的分頁。

7. Standby、Free、Zeroed 的差別

7.1. Standby

保留著與先前內容對應關係的狀態。

  • 若需要同一份內容,可以用軟性分頁錯誤取回
  • 若別的用途需要,可以丟掉舊識別再重複使用
  • 有依優先順序區分的 Standby 清單

7.2. Free

與先前內容的有效對應關係已經失去,處於可配置的狀態。不過分頁裡可能還殘留著舊的位元樣式。若原樣交給使用者模式,會有洩漏前一個處理程序資訊的風險。

7.3. Zeroed

內容為零,可以安全地當成使用者模式的新分頁交出的狀態。第1回的 demand-zero 錯誤,就是取得可用的 Zeroed 分頁並接到 PTE 的代表例子。從 Free 準備成 Zeroed,會依需求與系統狀態進行。

換句話說,「Free」與「Zeroed」看起來都像空閒,但安全性上的準備狀態並不相同。

8. 記憶體壓縮存放區 ── 在 RAM 裡再造一個去處

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 的選項。

9. 分頁檔真正的角色

分頁檔至少有三個角色。

分頁檔的三個角色分頁檔會拉高 Commit Limit、成為較少存取的已修改私有分頁的後備存放區,並成為系統當機傾印的承接處分頁檔拉高 Commit Limit(上限這一側的餘裕)已修改私有分頁的後備存放區系統當機傾印的承接處

圖 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 應用的 crash dump 收集入門 - 先搞清楚 WER / ProcDump / WinDbg 怎麼分工」。

10. 適當大小不是一律的

不該只用「RAM 的 1.5 倍」這類固定公式來決定分頁檔大小。Microsoft 說明,適當大小會因下列兩點而隨系統不同,無法一概而論。3

  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 在等待,以及磁碟是否飽和。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 裡的檔案資料。

讀同一個檔案兩次,看看還留著哪些分頁

  1. 先讀一次比較大的本機檔案。
  2. 結束讀取處理,然後 Refresh RAMMap。該檔案的分頁可能還留在 File Summary 或 Standby 這一側。
  3. 再讀一次同一個檔案。尚未被重複使用的分頁,可以在沒有磁碟 I/O 或只有少量 I/O 的情況下回來。

結果會隨記憶體壓力、防毒軟體與檔案大小而變。請看狀態轉換的方向,而不是單次的數字。

不要把 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

執行期間請同時記錄下列項目。

  • 工作管理員的「已認可 X/Y」
  • RAMMap 的 Active、Modified、Standby
  • Memory\\Committed Bytes
  • Memory\\Commit Limit
  • Memory\\Available MBytes
  • Memory\\Modified Page List Bytes

重現耗盡只在已拍快照的 VM 上進行

若要實際重現 Commit 耗盡,請不要在主機 PC 上做,而是在已拍快照的 VM 上逐步增加次數。讓它自動配置到上限的執行,可能造成畫面停住、處理程序異常結束、記錄遺失。目的不是讓作業系統不穩定,而是觀察 接近 Commit Limit 時,新的 Commit 會失敗。

12. 實務上要避開的四種誤讀

12.1. 「Standby 很多,所以是記憶體洩漏」

Standby 是可重複使用的快取,而且包含在 Available 裡。要判斷洩漏,看的是處理程序專屬 Commit 的基準線與配置明細,在負載結束之後是否仍持續增加。

12.2. 「把 Working Set 砍小就能修好洩漏」

修剪只改變常駐狀態,不會釋放 Commit 或虛擬配置。再次存取時,分頁會經由錯誤處理回來。

12.3. 「分頁檔使用量是 0,所以不需要」

分頁檔支撐的不只是目前的寫入量,還有 Commit Limit 與當機傾印。只憑平常的使用量就決定刪除,會失去尖峰時的餘裕與故障時的證據。

12.4. 「一定先記憶體壓縮,接著必定進分頁檔」

壓縮不是固定的序列式管線。Windows 會依分頁種類、壓縮效率、CPU 負載、記憶體壓力與有沒有後備存放區動態選擇。

13. 總結

  • PFN 資料庫是追蹤實體分頁的歸屬、參照、修改與分頁清單狀態的帳冊。
  • 離開 Working Set 的乾淨分頁留在 Standby,若需要同一份內容,可以用軟性分頁錯誤取回。8
  • 髒分頁在 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 應用程式的記憶體壓迫、Commit 耗盡、分頁、Working Set 成長,以及當機傾印取得設計的調查。

參考連結

  1. Microsoft Learn, MEMORYSTATUSEX structure. 關於 ullAvailPhys 是不必寫到磁碟就能立刻重複使用的實體記憶體,且為 Standby、Free、Zeroed 清單的總和。 ↩ ↩2 ↩3

  2. Microsoft Learn, Introduction to page files. 關於分頁檔會把較少存取的已修改分頁移出 RAM、拉高 Commit Limit,並支撐系統當機傾印。 ↩ ↩2 ↩3 ↩4

  3. 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

  4. Microsoft Learn, Data corruption on IO write. 關於 Modified Page Writer 是記憶體管理員的系統工作執行緒,會掃描以分頁檔為後備的髒分頁並寫出。 ↩ ↩2 ↩3

  5. Microsoft Learn, !pfn (WinDbg). 關於可以顯示指定 PFN 項目的狀態、參照與 PTE 位址等。 ↩

  6. Microsoft Learn, !memusage (WinDbg). 關於可以合計實體記憶體使用量,以及 Zeroed、Free、Standby、Modified、Active 等分頁狀態。 ↩

  7. Microsoft Learn, RAMMap - Sysinternals. 關於 RAMMap 的 Use Counts、Processes、Priority Summary、Physical Pages、File Summary、File Details 會顯示實體記憶體的用途與分頁清單。 ↩ ↩2

  8. Microsoft Learn, Working Set. 關於記憶體管理員為了騰出可用記憶體而修剪 Working Set,以及仍留在 Transition 或其他處理程序 Working Set 的分頁可以用軟性分頁錯誤解決。 ↩ ↩2

  9. Microsoft Learn, FileIo_Name class. 關於 ETW 的 File I/O 事件具有 FileObject 與 FileName,可以把 FileObject 與 Disk I/O 事件對應起來,以識別目標檔案的 I/O。 ↩

  10. Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. 關於 Windows 10 早期的 compression store 實作把 RAM 內的壓縮分頁集合放進 System 處理程序的 Working Set,以減少寫出到磁碟。 ↩ ↩2

  11. Microsoft Learn, Find Process ID (PID) in Windows. 關於現行 Debugging Tools for Windows 的處理程序清單範例中,System 底下會出現另一個 PID 的 Memory Compression 處理程序。 ↩

  12. Microsoft Learn, Testlimit - Sysinternals. 關於 Testlimit v5.24 的官方語法中,-m 是配置記憶體、-d 是配置並 Touch、-e 是配置間隔、-c 是配置次數,且 -c 要放在最後。 ↩

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

離開 Working Set 的分頁,會立刻寫進分頁檔嗎?
不會。未修改的分頁會帶著內容移到 Standby,成為可以立刻重複使用的快取。已修改的分頁會移到 Modified,視需要寫回分頁檔或對應的檔案之後,再進入 Standby 這類可重複使用的狀態。
工作管理員的 Available 有包含 Standby 記憶體嗎?
有。Windows 回報的可用實體記憶體是 Standby、Free、Zeroed 的總和。Standby 雖然還保留著舊內容,但必要時可以立刻改作他用,因此會被算進可用記憶體。
寫出到分頁檔,是等 RAM 完全用盡才開始的嗎?
不是。Windows 會依 Modified 清單與可用記憶體的狀態,在背景把較少存取的已修改分頁寫回。它不是等到徹底耗盡才一次全部趕出去的單純機制。
停用分頁檔會讓 Windows 變快嗎?
一般來說不能斷定會變快。停用會讓 Commit Limit 下降,較少存取的已修改分頁也更難從 RAM 移出,還會影響系統當機傾印。通常維持系統管理的設定,再量測尖峰 Commit 與傾印需求來判斷。
有了記憶體壓縮,分頁檔就不需要了嗎?
不會變得不需要。壓縮存放區是在 RAM 內壓縮分頁以減少 I/O 的機制,但壓縮後的分頁一樣占用實體記憶體,也取代不了 Commit 的保證。要壓縮還是換出,是記憶體管理員的動態策略。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽