Jak*_* S. 2 windows swap bad-alloc
对不起我的一般性问题,但我找不到明确的答案:
鉴于我有剩余的免费交换内存并且我以合理的块(~1MB)分配内存 - >内存分配是否因任何原因仍然失败?
smartass的回答是"是的,内存分配可能因任何原因而失败".这可能不是你想要的.
通常,您的系统是否剩余可用内存与分配是否成功无关.相反,问题是您的进程地址空间是否具有空闲的虚拟地址空间.
分配器(malloc,operator new...)首先查看当前进程中是否存在已映射的空闲地址空间,即内核是否知道地址应该可用.如果存在,则在分配器中保留该地址空间并返回.
否则,会要求内核将新地址空间映射到进程.这可能会失败,但通常不会,因为映射并不意味着使用物理内存 - 这只是一个承诺,如果有人试图访问此地址,内核将尝试查找物理内存并设置MMU表所以虚拟 - >物理翻译找到它.
当系统内存不足时,没有物理内存,进程被挂起,内核尝试通过将其他进程的内存移动到磁盘来释放物理内存.应用程序没有注意到这一点,除了执行单个汇编程序指令显然需要很长时间.
如果没有足够大的映射空闲区域并且内核拒绝建立映射,则进程中的内存分配将失败.例如,并非所有虚拟地址都可用,因为大多数操作系统将内核映射到某个地址(通常为0x80000000,0xc0000000,0xe0000000或32位架构上的某些地址),因此每个进程限制可能低于系统限制(例如,Windows上的32位进程只能分配2 GB,即使系统是64位).文件映射(例如程序本身和DLL)进一步减少了可用空间.
| 归档时间: |
|
| 查看次数: |
312 次 |
| 最近记录: |