2011-04-16 17 views
6

我們有一個在Windows 32位系統上運行的C++應用程序。一旦內存使用量達到1.5 GB,它就會崩潰。我們無法理解的是,爲什麼它會在1.5 GB的限制下崩潰而不是2 GB的限制(虛擬地址空間和Windows 32位體系結構限制)?C++應用程序在內存使用量達到1.5 GB時崩潰

其他詳情: - 可用的總內存:4GB

操作系統:Windows XP中

1.5 GB是僅此一個進程使用的內存。

問候,

薩欽

+1

我想弄清楚爲什麼你會有一個使用1.5GB內存的應用程序......我畫了一個空白。 (P.S.我相信你的應用程序不是當時運行的唯一東西) – 2011-04-16 06:14:52

+0

系統總共有多少內存?哪個版本的Windows? – jonsca 2011-04-16 06:15:13

+0

1.5GB是什麼的內存使用情況:唯一的過程還是整個系統? – 2011-04-16 06:17:00

回答

9

在32位Windows下這是完全正常的。

除非您激活了/ 3gb開關,否則您的總地址空間爲2GB。但是,這是減去映射的可執行文件和至少6打的DLL和NLS文件(「hello world」 - 一個真正的應用程序可能會更像十二二十個)。

由於它們未達到最佳位置,因此您將失去大約半個千兆字節的地址空間。堆不會「擴展」到該區域,因此分配超過1.5GB將會失敗。

下面是一個「典型的程序」的地址空間的樣子:

enter image description here

說明如何運用自如一個DLL被放置在地址空間的約1/3,有效地「切斷「你可以使用三分之一的記憶。

+1

好的答案和截圖的獎勵積分。如果您包含了用於捕獲地址空間碎片圖形的實用程序的鏈接(或至少是其名稱),將會很有幫助。 – 2011-04-17 04:49:41

+0

這就是VMMap:http://technet.microsoft.com/en-us/sysinternals/dd535533 – Damon 2011-04-17 12:28:01

4

虛擬內存的碎片可能是一個原因。

另一個可能的原因是內存管理器(內存池)通常如何工作。內存管理器嘗試保留比前一次多兩倍的內存塊。當內存分配已經相當多時,這個數量將會非常大,儘管實際上仍然有可用內存,但內存分配將失敗。

+0

除了碎片之外,其他工廠能否影響到這一點?發生這種崩潰與1.5 GB的內存限制非常一致。我們已經嘗試過幾次。 – sachin 2011-04-16 06:27:08

+0

@sachin:片段化部分是由DLL基地址引起的,而這往往是相當一致的。所以這可以解釋爲什麼1.5GB對你來說是如此可重複的。 – 2011-04-16 06:33:14

+0

我一直在Google上搜索這個問題。人們可以找到幾個查詢,其中應用程序崩潰了大約1.5 GB的內存使用量。可以有一些操作系統的特定設置強制1.5 GB的限制(而不是2 GB的Windows XP限制)還是隻是巧合? – sachin 2011-04-16 06:41:46

0

您可以啓用dr。 watson作爲默認調試器,並查看是否可以捕獲崩潰轉儲,然後使用visual studio或windbg打開轉儲,然後在崩潰之前可以看到callstack,然後知道崩潰的真正原因是什麼。

相關問題