我的系統: 物理內存:3GB
的Windows XP Service Pack 3中(32位) 交換文件大小:30GB
最大內存映射分配大小?
目標:爲了找到儘可能大的內存映射大小,我可以在我的機器上分配。
當我運行下面的代碼來分配2GB內存映射文件時,調用失敗。處理= CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE | SEC_COMMIT,0,INT_MAX,NULL);
我一直很困惑這一點,因爲我可以通過不斷調用CreateFileMapping(每次100mb)來分配一個內存映射文件,直到系統交換文件大小爲30gb。
重新啓動計算機後,重新運行請求2GB內存映射文件的應用程序到CreateFileMapping,它將起作用並返回有效句柄。所以這引起我有點困惑,在窗戶的引擎蓋下發生了什麼?
所以情況是這樣的,我可以使用所有系統頁面文件(30GB)創建很多小內存映射文件,但是當要求單個2GB分配時,調用失敗。重啓機器並運行相同的應用程序時,調用成功!
一些注意事項:
1)內存映射文件未被加載到proccess虛擬地址空間中,該文件沒有視圖。
2)操作系統可以爲30gb的系統頁面文件分配小的100mb內存映射文件!
現在我唯一可以得出的結論是,Windows XP SP3(32位)虛擬內存管理器無法在系統頁面文件中成功保留所請求的2gb,然後由於系統內存碎片而失敗(它似乎需要保留內存的連續分配,即使頁面文件每個都是4kb)。重新啓動後,我假設系統內存碎片較少,從而允許相同的調用成功並分配大小爲2GB的內存映射文件。
我已經運行一些實驗,機器運行一天後,我開始一個小的應用程序,將分配300MB的內存馬培德文件,然後將其釋放。然後它會增加1mb的大小,然後再試一次。最後它停在700mb並報告(系統資源不足)。然後,我會通過並關閉每個應用程序,這將反過來停止錯誤消息,並最終繼續分配一個3.5GB大小的內存映射文件!
所以我的問題是這裏發生了什麼?虛擬內存管理器內部必須存在某種類型的內存碎片,因爲分配100mbs的內存映射文件會佔用系統頁面文件的30gb(提交限制)。
更新
結論是,如果你要創建與INVALID_HANDLE_VALUE系統頁面文件支持大內存映射文件,那麼系統頁面文件(交換文件)需要調整到所需要的尺寸和在大分配> 2gb處於非零碎狀態!儘管IO負載很重,但仍然可能會失敗。爲了解決所有這些問題,您可以創建自己的具有所需文件大小的文件(我做了1tb),然後使用內存映射到該文件。
最後更新
我跑在Windows 7箱相同的測試,並讓我驚訝它的作品每一次(最多系統頁面文件大小)不接觸任何東西。所以我想這只是一個錯誤,Windows XP上的大內存分配可能會比Windows 7更頻繁地失敗。
我唯一能得出的結論是,容納2GB大小的4kb頁面文件的表對於系統內存來說太大了,無法處理,因此失敗。 – Chad 2011-01-14 15:22:52
這是一個謎。無論您的虛擬內存和物理內存有多大,無論您運行多少個進程,都無法在32位Windows上創建大於〜300MB的mem映射文件。 – 2011-01-14 15:44:21