3

在我的程序中,我使用 operator new 分配大约 130 兆字节并引发异常,但我发现任务管理器中有超过 800 兆字节可用。我希望知道任务管理器中指示为可用的物理内存与我的程序可以使用的内存之间的关系。

另一个原因是内存碎片。当我请求内存分配时,内存需要是连续的。有没有办法知道这种连续的记忆是否存在?

4

2 回答 2

4

物理内存<>虚拟内存。

如果您正在运行 32 位应用程序,则最多可以寻址 2 GB 内存(在 32 位操作系统上)。即使您的机器有 32 GB 的物理内存,您仍然被限制为 2 GB。如果您的计算机具有最小的物理内存(还记得我们都有 128 MB 物理内存的日子吗?),或者您正在运行许多其他应用程序,那么大小可以小于 2 GB(整个页面文件必须在所有应用程序之间进行划分)。

即使有 2 GB 内存,如果没有可用的 130MB 连续块,分配 130MB 也可能会失败。自 Windows Vista 以来,DLL 随机分布在地址空间中(查找:ASLR),这(根据我的经验)似乎会导致大量内存碎片。

您的问题有几种解决方案:

  • 如果您可以控制正在运行的系统,则可以为您的系统禁用 ASLR。如果您正在销售商业软件,请不要这样做。你的客户不会接受这个。
  • 如果您的 32 位应用程序在 64 位系统上运行,请为应用程序提供 /LARGEADDRESSAWARE 标志(请参阅链接器标志或 editbin 实用程序)。使用此标志,您的应用程序应该能够寻址 4 GB 而不是 2 GB。只有当你确定你没有用指针做“肮脏”的事情时才这样做(例如减去不相关的指针)。
  • 分配较小的内存而不是一个大块。抽象出你需要一个大块的事实(例如,围绕这个大块编写一个类)。

如果可能的话,我会选择最后一个选择。

于 2012-04-23T13:06:48.323 回答
0

我假设你在 Windows 上。可用的 RAM 量与 new 是否可以分配内存无关。这取决于您的进程的虚拟内存中是否有 130 MB 的连续虚拟内存块可用。将 RAM 视为有限的暂存器,操作系统可以在其中快速写入和读取。但是,如果它正在寻找的任何东西在暂存器中不可用,它将转到磁盘并将其写入暂存器。

于 2012-04-23T12:57:10.453 回答