SPW*_*ley 17 memory windows malloc 64-bit virtual-memory
malloc()失败的原因是什么,尤其是64位?
我的具体问题是试图在64位系统上使用巨大的10GB RAM.该机器具有12GB的RAM和32 GB的交换空间.是的,malloc极端,但为什么会出现问题呢?这是在Windows XP64中同时包含Intel和MSFT编译器.malloc有时成功,有时不成功,约50%.8GB malloc总是工作,20GB malloc总是失败.如果malloc失败,重复请求将不起作用,除非我退出该过程并再次开始一个新进程(这将成功获得50%的注射).没有其他大型应用程序正在运行 它会在重新启动后立即发生.
我可以想象如果你已经用完了32位(或31位)可用的地址空间,那么malloc会失败32位,这样就没有足够大的地址范围可以分配给你的请求了.
我还可以想象,如果你已经用完物理内存和你的硬盘交换空间,malloc会失败.对我来说情况并非如此.
但为什么malloc会失败呢?我想不出其他原因.
我对一般malloc问题比我的具体例子更感兴趣,无论如何我都可能用内存映射文件替换它.失败的malloc()只是一个难题而不是其他任何东西......想要了解你的工具而不是对基础知识感到惊讶.
malloc尝试分配一个连续的内存范围,这最初只是在实际内存中,因为交换内存的工作原理(至少就我记忆所知).很可能你的操作系统有时无法找到连续的10GB内存块,并且仍然会在RAM中同时保留所有需要实内存的进程(此时你的malloc将会失败).
你真的需要10GB的连续内存,或者你能够围绕几个较小的块包装存储类/结构,而是以块的形式使用你的内存吗?这放宽了巨大的连续需求,并且还应允许程序将交换文件用于较少使用的块.
你已经尝试使用VirtualAlloc()和VirtualFree()直接?这可能有助于隔离问题.
如果虚拟地址空间预留失败(即使它不应该,从您所说的内容判断),Sysinternals VMMap可能有助于解释原因.打开"显示免费区域"以查看免费虚拟地址空间是如何分段的.