當我有足夠的可用記憶體時,Windows 10 記憶體不足警告

當我有足夠的可用記憶體時,Windows 10 記憶體不足警告

我一直遇到一個問題,如果我的系統在沒有重新啟動的情況下運行了幾天,我將開始收到警告說“關閉程序以防止信息丟失”,然後出現一個對話框建議我關閉程序,我可以取消或點擊該對話方塊“關閉程式”,Windows 將強制關閉對話方塊中列出的部分或全部應用程式。

我打開任務管理器,發現目前只有大約 30% 的記憶體被使用:

33% 利用率

當我打開資源監視器查看特定應用程式使用了多少提交記憶體時,我仍然看到相對較低的記憶體使用量:

資源監控器

我遇到這個問題已經有一段時間了,並且一直在努力尋找解決方案。我已經使用 poolmon 調查了驅動程式洩漏等原因,但從未在 poolmon 中看到任何與其他人所描述的驅動程式記憶體洩漏危險訊號相符的內容。讓我特別困惑的是為什麼當我的系統記憶體僅使用33%時Win10告訴我關閉應用程式。

答案1

這裡的猜測。

您已按照某人隨機的“優化”建議禁用了交換文件。

您有某種作業系統驅動程式需要一大塊連續的實體 RAM。但它無法獲取它,因為隨著時間的推移,所有實體 RAM 都已碎片化。並且由於交換文件已停用,因此無法進行 RAM 碎片整理。

啟用您的交換文件。

正如我所說,瘋狂的猜測。

答案2

關於您的最後一個問題 - 簡短版本:錯誤訊息是關於「提交的」虛擬地址空間。如果您查看第二個螢幕快照中的「提交費用」圖表,您會發現它確實達到或非常接近極限。

「空閒」、「可用」或「使用中」的 RAM 量並不重要。特別是「可用」RAM 短缺絕對不是「記憶體不足」或「記憶體不足」訊息的原因。

提交限制等於總 RAM + 頁面檔案大小。當提交的記憶體被分配時,它會立即被收取“提交費用”,即使它實際上還沒有被使用……這意味著沒有立即使用 RAM 或 PF 空間。物理空間(無論是在 RAM 還是頁面檔案中)僅在實際引用記憶體時使用。從那時起,它必須有某個地方,直到程式釋放它,或整個過程結束。

範例:假設您沒有頁面文件,因此您的提交限制為 16 GB(您的 RAM 大小)。現在,假設 8 個行程各自嘗試 VirtualAlloc(MEM_COMMIT) 1 GB。結果:提交費用增加 8 GB。然而,這對 RAM 沒有立即影響!就好像你在文具店買了一張紙,但實際上你並沒有買到任何紙。不過,每當您需要一張新紙時,一張新紙就會神奇地出現。直到用完整個焊盤(分配區域的大小)。

現在假設每個進程實際上只存取其 1 GB 中的 100 MB。使用的 RAM 僅為 800 MB。

但既然他們每個人可能參考其全部 1 GB,作業系統必須確保 8 GB RAM+頁面檔案空間……好吧,在沒有頁面檔案的情況下只有 RAM……保持可用,以防萬一發生這種情況。回到文具店,他們需要保留足夠的紙張庫存,以便為每個人提供與之前購買的一樣多的紙張。

因此,噹噹前提交的數量達到限制時,作業系統必須停止允許 VirtualAlloc(MEM_COMMIT) 成功。

為什麼?因為進程期望檢查VirtualAlloc的結果,看看是否成功。一旦完成並發現分配成功,該程序就完全有權期望其對整個提交區域的後續引用將會成功。

如果 Windows 允許提交費用超過實現該空間的可用空間量,則無法始終滿足該期望。

一個快速的解決方法是增加頁面檔案的預設(=初始)大小。從上面的解釋你應該能夠明白為什麼這會避免錯誤訊息即使沒有任何內容可能會寫入該文件。同樣,作業系統確保所有提交費用的空間可用如果需要的話。當進程分配提交的記憶體時,它們只是說「嘿,作業系統,我可能需要這麼多。

有關更多信息,請參閱我的回答在這裡

現在....為什麼當您的流程似乎不符合要求時,您正在使用這麼多提交,這是另一個問題。若要開始查看這一點,請顯示任務管理器的「效能」標籤的「記憶體」部分。

答案3

另一種可能性是您使用的是 Win10 32 位,而不是 64 位。雖然您安裝了 16GB RAM,但 32 位元作業系統有限制,實際使用時會出現 4 個不穩定的情況。此外,作業系統將對/每個進程/可要求的 RAM 量施加硬性限制,無論實體 RAM 是多少。如果是這種情況,除了切換到 64 位元作業系統或同時運行更少的應用程式之外,您無能為力。

相關內容