2010-02-02 93 views
0

我的系統是Windows XP。 在TaskManager中顯示的虛擬大小與從GlobalMemoryStatusEx獲取的MEMORYSTATUSEX.ullAvailVirtual不同。虛擬大小和GlobalMemoryStatusEx

當我創建大量的緩衝區並且內存使用量已經增加時,MEMORYSTATUSEX.ullAvailVirtual可以很好地反映虛擬大小的使用情況。這是一樣的。

但是,當我刪除內存時,任務管理器中的虛擬大小已關閉,但MEMORYSTATUSEX.ullAvailVirtual仍然很小。我不知道爲什麼....

我完全困惑。

+0

我認爲MEMORYSTATUSEX.ullAvailVirtual只意味着未預留的內存大小。只要進程正在運行,該值總是小於或等於先前的值。 – Buzz 2010-02-02 08:55:30

回答

0

可能遭受內存碎片。 (也就是說,如果您在每個大分配之間佔用幾個字節,它會有效地強制您的應用程序的虛擬字節)。

您可能會發現將數字與perfmon進行比較會更加可靠 - 我過去一直使用的計數器是專用字節(實際分配的內存)和虛擬字節(分配的內存地址空間) - 如果這兩個計數器分開,那麼你有一個內存碎片問題,這將是內存泄漏的結果。任務管理器中的數字雖然真實準確,但並未表達任何特別有用的內容。

0

當您刪除分配的內存時,操作系統不會立即返回該內存,而是保留該進程的內存,至少直到另一個進程需要該內存爲止。這可以提高性能,因爲幾秒鐘之後,幾乎相同的進程可能需要剛刪除的內存。

要真正釋放內存中刪除,你可以叫

SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1); 

也許這將迫使GlobalMemoryStatusEx()返回你期望的值?

+0

謝謝。我不確定我是否會嘗試,因爲它似乎是一個系統影響。 我將嘗試TBB分配器。我發現它的分配速度比CRT默認的新速度快。它在大量內存分配方面看起來很獨特。 – Buzz 2010-02-03 09:55:15