2012-11-07 154 views
0

我在過去四年中使用pageheap來調試堆損壞。一般來說,我沒有任何問題。但是現在我面對奇怪的行爲。 使用全局標誌具有以下標誌啓用頁堆了我的進程在Win7-SP1-86主機後: -Enable堆尾檢查 -Enable堆免費檢查 -Enable頁堆Pageheap消耗大量內存

我注意到崩潰失內存異常。 !address -summary命令表示約有90%的虛擬內存被PageHeap佔用。

這對我來說真的很奇怪,因爲,據我所知,pageheap不應該導致如此大的內存開銷。

可以請某人解釋什麼是這種行爲的原因?

+3

pageheap尾部檢查在每個分配塊的末尾「添加」一個受保護的頁面。一個頁面通常是4K,這就是你看到內存增加的原因。即使是最小的塊也會在頁面末尾分配,總共浪費了大約8K。例如,這會將我正在編寫的其中一個應用程序的內存使用量從30M增加到400M。我正在分配很多小塊,並且對此進行優化還沒有結束。 – ActiveTrayPrntrTagDataStrDrvr

+3

有可能您的應用程序有內存泄漏? Pageheap放大了內存泄漏的影響。 –

+1

!堆將顯示多少個塊,並且如上所述,即使是最小的塊也需要8K,所以內存不足通常不會令人驚訝 –

回答

0

在啓用完整頁面堆的情況下運行應用程序時,會爲每個'malloc'分配2頁(4kb)。當內存被釋放時,這些頁面(或者可能只是第一個)仍然是'保留'的:它們不佔用任何物理或頁面文件內存,但虛擬地址範圍不可用,並且當訪問衝突試圖訪問這個內存。這使得可以捕獲無讀後類型的錯誤。因此,即使您爲每個malloc正確調用free,應用程序的虛擬地址空間也會不斷增加。