我们有一个运行在Windows 32位系统上的C ++应用程序。 一旦内存使用量达到1.5 GB,就会崩溃。 我们无法理解的是,为什么它会在1.5 GB的限制下崩溃,而不是在2 GB的限制(虚拟地址空间和Windows 32位体系结构限制)?
其他细节: – 可用内存总量:4GB
操作系统:Windows XP
1.5 GB是这一个进程使用的内存。
问候,
萨钦
这在32位Windows下是完全正常的。
除非您激活了/ 3gb开关,否则您的总地址空间为2GB。 但是,这是减去映射的可执行文件,至少有六个DLL和NLS文件(“hello world” – 一个真正的应用程序可能会有更多的十二二十个)。
由于它们不是最佳放置位置,因此您将失去大约半个千兆字节的地址空间。 堆不会成长为“进入”该地区,因此分配超过1.5GB将失败。
以下是“典型程序”的地址空间:
请注意,一个DLL如何巧妙地置于地址空间的1/3左右,从而有效地“切断”了可以使用的三分之一的内存。
虚拟内存的碎片可能是一个原因。
另一个可能的原因是内存管理器(内存池)通常是如何工作的。 内存管理器尝试保留比前一次更多的内存块。 当内存分配已经相当多的时候,这个数量将会非常大,尽管实际上仍然有可用的内存,但内存分配将会失败。
你可以启用博士。 watson作为默认的调试器,然后查看是否可以抓取崩溃转储,然后用visual studio或windbg打开转储,然后在崩溃之前可以看到调用堆栈,然后知道崩溃的真正原因是什么。