你是否曾在任務管理器中看到成百上千個進程,卻發現物理內存佔用遠低於它們「申請」的總和?這並非魔法,而是現代作業系統內存管理的核心機制——虛擬內存與共享頁框共同作用的結果。
當多個進程載入同一個動態鏈接庫(如 Visual C++ Runtime DLL)或運行同一個程序的多個實例時,作業系統會將該 DLL 的代碼段與唯讀數據段對應的物理頁框,映射到每個進程各自的虛擬地址空間中。這意味著:
進程的堆、棧、數據段等可寫區域屬於私有內存。這部分內存不共享,每個進程獨佔物理頁框(或交換文件槽位),才是實實在在消耗系統資源的大戶。
當物理內存緊張時,內存管理器會將長時間未訪問的頁面(如最小化窗口的進程內存)寫入磁盤上的頁面交換文件,騰出物理頁框給活躍進程。下次進程需要這些數據時,再觸發缺頁中斷從磁盤換入。因此,系統可用內存實為:物理內存 + 虛擬內存(交換文件)。
在 32 位 Windows 上,單進程虛擬地址空間僅 4 GB(默認用戶態 2 GB),且部分物理內存可能因地址線不足而無法寻址,進一步加劇「看起來內存不夠用」的假象。
幾百個進程能在幾 GB 內存裡「和諧共處」,靠的是:
理解這套機制,能幫助你更準確地分析內存洩漏、優化程序內存佔用,也能在面試中自信應對「進程內存為什麼不等於物理內存」這類經典問題。