簡體   English   中英

強制Windows釋放分配的內存

[英]Forcing Windows to free allocated memory

我在這里處理一些奇怪的情況,但這正是我計划創建的。 這只是一種特殊的測試軟件...

我的環境:MSVS 2012,Windows 7/8 32b / 64b。

因此,首先,我創建了一些內部結構/緩沖區/等,以便在我的應用程序中使用,然后我做了類似的事情(在這里做了一些簡化,請像對待偽代碼一樣對待):

{
   std::deque<boost::scoped_array<unsigned char>> deque;
   try {
     while (1) {
       deque.push_back(boost::scoped_array<unsigned char>(new unsigned char[system_page_size])); // happens to be 4096 on my system
     }
   }
   catch (std::bad_alloc& ex) { ... }
   // do something here
}

我需要使用盡可能多的內存。 我要一次分配整個頁面(也許這很不好,應該為雙端隊列/智能ptr的數據留一些空間嗎?)。 當CRT決定不再有分配空間時,我將做更多的事情(根本不依賴任何內存可用性),然后退出范圍。 它將觸發析構函數鏈,所有這些數據都應釋放。

這很好。 但是我碰巧不是一次進入這個奇怪的范圍,而是一次進入10次。 有時它可以工作2到3次。 有時只有一次。 下次,我只會遇到內存不足的錯誤,僅此而已。

從我的角度來看,我需要重新啟動整個過程才能真正強制釋放內存。 是否有一種方法可以在單個過程中實現?

我可以考慮嘗試使用其他分配器-也許是CRT問題? 我也玩了一些堆操作(即低碎片堆),但也沒有幫助。

為什么不使用MEM_RESERVE通過幾個大型的VirtualAlloc調用來保留進程的整個內存空間。 然后,您稍后將在每個內存范圍上調用VirtualFree進行釋放。 這仍然需要一定數量的堆分配,就像您在這里所做的那樣,以耗盡當前堆的其余部分。 它將更快,並消除您必須遇到的頁面文件混亂。

至於您的特定問題,我不知道您為什么會遇到。 保留所有內存以使堆無法擴展應有助於減少不確定性。

如果您使用大量內存,請使用某種類型的平板分配(VirtualAlloc會為您分配內存),然后,原則上[假設您在該塊中創建的對象不需要析構函數來做某事] ,您可以一次性丟棄整個數據塊,而不用使用數以千計的刪除操作-節省時間並確保完全釋放內存,這是額外的好處。

我懷疑您可能有問題的一個原因是釋放的塊必須先清除,然后才能回收。 這是在內核的后台線程中完成的。 當然,使用VirtualALloc對該帳戶實際上沒有幫助。

當然,也可能會出現內存碎片,在這種情況下,使用旨在避免這種情況的磁頭會起作用。

暫無
暫無

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

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