為什麼 Windows 總是使用與安裝的 RAM 一樣多的虛擬記憶體?

為什麼 Windows 總是使用與安裝的 RAM 一樣多的虛擬記憶體?

為什麼它希望最多擁有該數量的兩倍?我的系統有 32GB RAM,Windows 預設設定至少 16MB 虛擬內存,分配 32GB(!),建議 50GB(!!)。更糟的是,在 64GB RAM 系統上,它建議分配超過 100GB 的空間,儘管它「僅」再次使用了 RAM 中可用的相同數量,在本例中為 64GB。

據我了解頁面文件的概念是,Windows 僅在需要時擴展它,並從最小數量開始,儘管它永遠不會這樣做,但它總是進入絕對最大值。這是非常煩人的,因為禁用頁面檔案或不將其設定為與安裝的RAM 數量相同的值,會導致某些使用大量記憶體的程式(例如7zip)出現問題,他們只是聲稱沒有足夠的記憶體來分配,即使有足夠的記憶體可用記憶體。

這種行為可能會大大縮短我的驅動器 (SSD) 的使用壽命。 Windows 為什麼這樣做以及如何防止這種情況,或者如何完全停用頁面檔案而不在某些程式中出現奇怪的行為。

答案1

首先,Windows 的對話框(您設定頁面檔案大小的對話框)將頁面檔案等同於“虛擬記憶體”,這是一個巨大的錯誤(不是您的錯誤)。頁面檔案只是一類虛擬位址空間的後備存儲,由私有提交記憶體使用。存在由其他檔案(映射檔案)支援的虛擬位址空間,並且存在始終不可分頁的 vas,因此始終保留在 RAM 中。但這都是“虛擬記憶體”,至少從虛擬位址到 RAM 位址的轉換始終在進行。

您的觀察是正確的:Windows 頁面檔案大小的分配使用預設 = RAM 大小和最大值 = 兩倍的簡單計算。 (以前是 1.5 倍和 3 倍。)他們必須將其設定為某個值,而這些因素提供的結果幾乎總是足夠的。如果系統崩潰,它還保證有足夠的頁面檔案空間來捕獲記憶體轉儲(假設您已啟用核心或完整轉儲)。

據我了解頁面文件的概念是,Windows 僅在需要時擴展它,並從最小數量開始,儘管它永遠不會這樣做,但它總是進入絕對最大值。

啊......它從「初始大小」開始。這不是「允許的最小值」。這就是為什麼您會看到它的 RAM 大小,因為 Windows 使用它作為初始大小。

但是...您是說您看到實際頁面文件大小達到了最大設定嗎?例如,如果初始設定為 16 GB,則最大設定為 32 GB,您會看到實際大小(「目前分配的」)為 32 GB?順便說一句,當您重新啟動時,它應該始終恢復到初始大小。

您是否看到“系統虛擬記憶體不足”彈出視窗?因為當作業系統將頁面檔案擴展超出當前大小時,您應該這樣做。

作業系統不會擴大頁面文件,除非確實嘗試分配如此多的私有提交內存,以至於需要擴大的頁面文件空間來存儲這些內容。但是,也許有什麼。查看任務管理器的進程標籤。 「提交大小」列顯示了每個進程的這一點。點擊列標題即可查看豬是誰。 :)

這是非常煩人的,因為禁用頁面檔案或不將其設定為與安裝的RAM 數量相同的值,會導致某些使用大量記憶體的程式(例如7zip)出現問題,他們只是聲稱沒有足夠的記憶體來分配,即使有足夠的記憶體可用記憶體。

這與可用 RAM 無關,而是與「提交費用」和「提交限制」有關。 「提交限制」是(RAM - 不可分頁虛擬記憶體)+目前頁面檔案大小的總和。 (不是空閒 RAM,只是 RAM。)因此,具有 8 GB RAM 和 16 GB 當前頁面文件的系統的提交限制約為 24 GB(“大約”是因為保存不可分頁內容的 RAM 不計入提交限制) 。

「提交費用」是系統中目前存在多少私有位址空間。這必須小於提交限制,否則系統無法保證該內容有位置。

在任務管理器的「效能」標籤上,您可以看到這兩個數字以及圖例「提交(GB)」。例如,我正在查看一台顯示“Commit (GB) 1/15”的機器。這是 15 GB 限制之外的 1 GB 目前提交費用。

如果像 7zip 這樣的程式嘗試執行例如大小 > (commitLimit - commitCharge) 的 VirtualAlloc,即大於「剩餘」提交限制,那麼如果作業系統無法擴展頁面檔案以使提交限制足夠大,則分配請求失敗。這就是你所看到的情況。 (Windows實際上沒有「實體記憶體不足」的錯誤訊息,不適用於使用者模式存取!僅適用於虛擬。)

與以下無關自由的RAM,因為所有 RAM(減去不可分頁的微小位元)都計入提交限制,無論其當前是否空閒。

這很令人困惑,因為當您在這些分配失敗之一之後查看系統時,沒有任何明顯的錯誤 - 您查看系統,您的提交費用遠低於限制,您甚至可能有大量可用 RAM。您必須知道程式嘗試分配多少私有提交記憶體才能了解問題所在。大多數程式不會告訴你。

在我看來,7zip 在嘗試分配 vas 方面過於激進,也許它正在根據您的 RAM 大小調整其請求?您確定沒有更小的頁面文件設定能讓 7zip 滿意嗎?您使用的是 32 位元還是 64 位元版本的 7-zip?使用 32 位元版本可以解決此問題,因為它不可能使用超過 2 或 3 GB 的虛擬位址空間。當然,在大型資料集上它可能不會那麼快。

這種行為可能會大大縮短我的驅動器 (SSD) 的使用壽命。

嗯,不,不是真的。簡單地放置一個無論大小的頁面文件並不意味著系統實際上會向頁面文件寫入那麼多內容。 (除非您將選項設為“關閉時清除頁面文件”,即使如此,我也不認為它會寫入整個內容;MM知道正在使用哪些區塊,並且應該只寫入那些......我從來沒有想過之前我得檢查一下。

如果您想查看頁面檔案中實際有多少內容,請使用 PerfMon 實用程式。頁面檔案有一個計數器組,您當然需要“%使用”計數器。根據檔案的實際大小解釋此百分比(如資源管理器中所示)。

它確實使用了大量空間,而且由於 SSD 上的空間非常昂貴,這是我們大多數人所關心的問題。您可以嘗試的一件事是在 SSD 上放置一個合理大小的頁面檔案(例如 4 或 8 GB),然後連接一個旋轉的 rust 驅動器並在其上放置一個大的頁面檔案。或者,如果您想要一個 SSD,而不需要其他任何頁面文件,請購買一個便宜的小型 SSD,僅用於第二個頁面文件。

相關內容