3

抱歉我的问题比较笼统,但我找不到明确的答案:

鉴于我还有空闲的交换内存,并且我以合理的块(~1MB)分配内存->内存分配仍然会因任何原因而失败吗?

4

3 回答 3

6

聪明的答案是“是的,内存分配可能因任何原因而失败”。这可能不是你要找的。

一般来说,你的系统是否有空闲内存与分配是否成功无关。相反,问题是您的进程地址空间是否有空闲的虚拟地址空间

分配器 ( malloc, operator new, ...) 首先查看当前进程中是否存在已映射的空闲地址空间,也就是说,内核知​​道这些地址应该是可用的。如果有,则在分配器中保留该地址空间并返回。

否则,内核被要求将新的地址空间映射到进程。这可能会失败,但通常不会失败,因为映射并不意味着使用物理内存——这只是一个承诺,如果有人尝试访问此地址,内核将尝试查找物理内存并设置 MMU 表所以虚拟->物理翻译会找到它。

当系统内存不足时,没有剩余的物理内存,进程被挂起,内核尝试通过将其他进程的内存移动到磁盘来释放物理内存。应用程序没有注意到这一点,只是执行一条汇编指令显然需要很长时间。

如果没有足够大的映射空闲区域并且内核拒绝建立映射,则进程中的内存分配会失败。例如,并非所有虚拟地址都可用,因为大多数操作系统将内核映射到某个地址(通常,0x80000000、0xc0000000、0xe0000000 或 32 位架构上的类似地址),因此每个进程的限制可能低于系统限制(例如,Windows 上的 32 位进程只能分配 2 GB,即使系统是 64 位)。文件映射(例如程序本身和 DLL)进一步减少了可用空间。

于 2011-11-21T14:28:54.140 回答
0

一个非常普遍和理论上的答案是否定的,它不能。在非常特殊的情况下它可能失败的原因之一是您的可用/可分配内存会有一些奇怪的碎片。我想知道您是否正在尝试获得(可能非常轻微)性能提升(如果指针 == NULL 则跳过),或者您只是想知道并想讨论它,在这种情况下您可能应该使用聊天。

于 2011-11-21T14:28:33.730 回答
0

是的,当您在 32 位应用程序中用完内存空间时,内存分配通常会失败(可能是 2、3 或 4 GB,具体取决于操作系统版本和设置)。这将是由于内存泄漏。如果您的操作系统用完交换文件中的空间,它也可能会失败。

于 2011-11-21T14:29:00.707 回答