每个进程允许的最大堆使用量

时间:2009-08-27 17:52:24

标签: c++ memory-management visual-c++ heap

我使用malloc来分配内存,内存要求大于1GB。程序崩溃......

我想问一下这个问题是否可以解决?如果是的话怎么样?

我的RAM大小为3GB,使用32位Windows操作系统并使用vc ++进行编程

3 个答案:

答案 0 :(得分:13)

每进程内存限制为2GB(除非您使用Windows /3GB switch)。但是,您可能会遇到内存碎片。当内存碎片化(使用VMMap可视化)时,您将无法分配大的连续块。您的选择是:

  • 分配较小的块(首选)
  • 找到一些对内存进行碎片整理的方法
  • 升级到64位操作系统(您仍然可以编译32位代码,但用户模式内存最多可达4GB - 请记住打开大内存感知编译器标志;如果编译64位代码,在32位操作系统上根本不运行,但内存限制远高于4GB)
  • 如果您需要那么多内存来加载文件,您可能能够对该文件进行内存映射
  • 您可能能够比较小的块更早地分配最大的块。

答案 1 :(得分:2)

在32位Windows操作系统上,每个进程获得4 GB虚拟地址空间,其中2 GB可供用户使用,2 GB用于内核。因此,无论做什么分配都应该在这个2 GB的空间内。请注意,此2 GB包含其他内容,例如应用程序加载的其他dll,因此此内存是碎片。当你执行malloc()时,由于malloc保证它返回一个连续的内存块,CRT将尝试找到1 GB的可用内存,因此malloc()失败。解决此问题的一种方法是使用内存映射文件,并将所需内存的一部分映射到虚拟地址空间。

答案 2 :(得分:2)

如果虚拟内存空间中没有足够的连续空间,则无法对其进行实际映射内存块。所以你应该检查你的记忆区域。

你的dll和exes映射到哪里? 有一个工具rebase.exe是ms vc框架的一部分,它允许你重新分配你的dll或exe加载到的位置。这可以为您提供更多可用的虚拟内存空间,从而可以获得更大的内存块。

"dependency walker"的个人资料选项会显示你的dll和exe的位置 加载到。

来自sysinternals的

vmmap可以帮助更好地理解mwmory如何被分段和处理。