Windows 記憶體的分配
虛擬記憶體的概念在上個世紀五十年代就提出了,當時是作為解決不能一次裝入實際記憶體的程式這一複雜問題的方案提出的。在虛擬記憶體系統中,程式可以訪問超出可用實體記憶體的更大的地址集合,專用記憶體管理程式將這些邏輯地址對映到實際地址,使用磁碟上的臨時儲存儲存超出的部分。
Windows 所使用的現代虛擬記憶體實現中,虛擬儲存被組織成大小相同的單位,稱為 頁。每個作業系統程序佔用自己的 虛擬地址空間,即一組可以讀寫的虛擬記憶體頁。每個頁可以有三種狀態:
- 自由:還沒有程序使用這部分地址空間。如果企圖訪問這部分空間,無論讀寫都會造成某種執行時失效。該操作將導致彈出一個 Windows 對話方塊,提示出現了訪問衝突。(Java 程式不會造成這種錯誤,只有用支援指標的語言編寫的程式才可能造成這種問題。)
- 保留:這部分地址空間保留給程序,以供將來使用,但是在交付之前,不能訪問該地址空間。很多 Java 堆在一開始處於保留狀態。
- 提交:程式可以訪問的記憶體,得到了完全 支援,就是說已經在分頁檔案中分配了頁幀。提交的頁只有在第一次被引用時才裝入主存,因此成為 請求式分頁。
圖 1. 程序地址空間中的虛擬頁到物理頁幀的對映
如果執行的是 32 位機器(如一般的 Intel 處理器),那麼程序的整個虛擬地址空間就是 4GB,因為這是用 32 位所能定址的最大地址空間。Windows 通常不會允許您訪問地址空間中的所有這些記憶體,程序自己使用的只有不到一半,其他供 Windows 使用