64位大型mallocs

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()只是一个难题而不是其他任何东西......想要了解你的工具而不是对基础知识感到惊讶.

wor*_*ad3 8

malloc尝试分配一个连续的内存范围,这最初只是在实际内存中,因为交换内存的工作原理(至少就我记忆所知).很可能你的操作系统有时无法找到连续的10GB内存块,并且仍然会在RAM中同时保留所有需要实内存的进程(此时你的malloc将会失败).

你真的需要10GB的连续内存,或者你能够围绕几个较小的块包装存储类/结构,而是以块的形式使用你的内存吗?这放宽了巨大的连续需求,并且还应允许程序将交换文件用于较少使用的块.

  • 空白是绝对正确的.. 64位的地址空间远远大于10 GB!(注意,可能存在隐藏的2 ^ 48地址大小限制,这仍然大于10GB!= 2 ^ 33) (2认同)

bk1*_*k1e 5

你已经尝试使用VirtualAlloc()VirtualFree()直接?这可能有助于隔离问题.

  • 您将绕过C运行时堆和NT堆.
  • 您可以保留虚拟地址空间,然后提交它.这将告诉您哪个操作失败.

如果虚拟地址空间预留失败(即使它不应该,从您所说的内容判断),Sysinternals VMMap可能有助于解释原因.打开"显示免费区域"以查看免费虚拟地址空间是如何分段的.


bdo*_*lan 2

您是否尝试过使用堆函数来分配内存?