簡體   English   中英

當物理內存中的可用空間非常小時,Windows仍然能夠分配內存嗎?

[英]Will Windows be still able to allocate memory when free space in physical memory is very low?

在Windows 32位系統上,正在使用Visual Studio開發應用程序:

可以說,我的計算機上正在運行許多其他應用程序,它們已經占用了幾乎所有的物理內存,並且僅剩1 MB內存可用。 如果我的應用程序(尚未分配任何內存)嘗試分配2 MB,則調用是否成功?

我的猜測:從理論上講,每個Windows應用程序都具有2GB的虛擬內存。 因此,我相信此調用應該會成功(無論有多少物理內存可用)。 但是我不確定。 這就是為什么在這里問。

Windows堅決保證這將始終有效。 僅當Windows可以在頁面文件中分配空間以進行分配時,進程才能分配虛擬內存。 如有必要,它將增加分頁文件以提供空間。 如果失敗,例如當分頁文件超過預設的限制時,分配也會失敗。 Windows沒有Linux的“ OOM殺手”,它不支持過量提交,這可能要求操作系統啟動隨機殺進程來尋找RAM。

請注意,“始終有效”子句確實有刺痛感。 無法保證需要多長時間。 在非常極端的情況下,計算機可能開始崩潰,在運行的進程中幾乎每一次內存訪問都會導致頁面錯誤。 代碼執行速度會變慢,您可以在資源管理器或鼠標或視頻驅動程序開始崩潰時凍結鼠標指針,從而失去控制。 發生這種情況時,您已經遠遠超過了購買RAM的地步。 Windows將配額應用於進程以防止它們占用計算機,但是如果您有足夠的進程在運行,則不一定能避免此問題。

當然。 如果現在必須浪費內存以便以后使用,那就太糟糕了。 操作系統隨時會不斷地將內存重新利用到其最有利的用途。 他們不必只是為了使其空閑而浪費內存,以便以后使用。

好吧,只要有內存,它就會成功-除了物理內存,還有頁面文件。

但是,一旦達到RAM 頁面文件的限制,就完成了,那時內存不足的情況才真正變得有趣。

現在,Windows Vista之類的系統將嘗試使用所有可用的RAM,幾乎用於緩存。 這是一件好事,當應用程序請求內存時,緩存將根據需要被丟棄。

至於虛擬內存,無論您的RAM或頁面文件大小如何,您都可以請求更多可用資源。 僅當您提交內存時,它實際上才需要一些支持-RAM或頁面文件。 在64位上,您可以輕松請求TB的虛擬內存-這並不意味着您嘗試提交時會得到它,盡管:P

這是帶有頁面文件的虛擬內存的好處之一。 因為內存是虛擬的,所以系統可以分配比物理內存更多的虛擬內存。 無法容納在物理內存中的虛擬內存被推出到頁面文件中。

因此,您的系統可能正在使用所有物理內存的事實並不意味着您的程序將無法分配內存。 在您描述的情況下,您的2MB內存分配將成功。 如果您隨后訪問該內存,則虛擬內存將被分頁到物理內存中,並且很可能其他一些頁面(可能在您的進程中,可能在另一個進程中)被推送到頁面文件中。

如果您的應用程序無法分配物理內存(RAM)塊來存儲信息,則操作系統將接管頁面並“分頁”或將RAM中的部分存儲在磁盤上以釋放物理內存,以便您的程序能夠執行分配。 這是自動完成的,對您的應用程序完全不可見。

因此,在您的示例中,在具有1MB可用RAM的系統上,如果您的應用程序嘗試分配內存,則操作系統會將頁面上的物理內存內容分頁到磁盤上,並為應用程序釋放RAM。 在這種情況下,您的應用程序不會崩潰。

這顯然比這復雜得多。

有幾種方法可以在Windows上配置頁面文件(固定大小,可變大小以及在哪個磁盤上)。 如果物理內存不足,硬盤空間不足(由於過多的“分頁”而使頁面文件變得很大)或達到頁面文件的限制(如果是靜態限制),則您的應用程序因內存不足異常而失敗 但是,對於當今具有大型本地存儲的系統,這是罕見的事件。

確保閱讀有關整個圖片的分頁。 查看:

http://en.wikipedia.org/wiki/分頁

在某些情況下,您會注意到您有足夠的可用物理內存。 假設為100MB,則您的程序嘗試分配10MB的塊來存儲大對象,但失敗。 這是由物理內存碎片引起的。 盡管總的可用內存為100MB,但是沒有一個連續的10MB塊可用於存儲對象。 這將導致需要在代碼中處理的異常。 如果在代碼中分配了大對象,則可能需要將分配分成較小的塊以方便分配,然后將它們聚合回代碼邏輯中。 例如,您可以在一個數組中聲明10 x 1m個向量,而不是單個10m向量,並為每個單獨的向量分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM