malloc() 失败的原因是什么,尤其是在 64 位中?
我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM。
该机器有 12GB RAM 和 32GB 交换空间。
是的,malloc 是极端的,但是为什么它会成为一个问题呢?这是在带有 Intel 和 MSFT 编译器的 Windows XP64 中。 malloc 有时成功,有时不成功,大约 50%。 8GB malloc 总是有效,20GB malloc 总是失败。如果 malloc 失败,重复的请求将不起作用,除非我退出该进程并再次启动一个新进程(这样就有 50% 的成功机会)。没有其他大型应用程序正在运行。即使在重新启动后立即也会发生这种情况。
我可以想象,如果您用完了 32 位(或 31 位)可用的地址空间,则 malloc 在 32 位中会失败,这样就没有足够大的地址范围来分配给您的请求。
我还可以想象如果你用完了你的物理 RAM,malloc 会失败and你的硬盘交换空间。我的情况并非如此。
但为什么 malloc 会失败呢?我想不出其他原因。
我对一般的 malloc 问题比我的具体示例更感兴趣,无论如何我可能会用内存映射文件替换它。失败的 malloc() 比其他任何事情都更令人困惑......渴望了解您的工具而不是对基本原理感到惊讶。
malloc 尝试分配连续的内存范围,这最初将在实际内存中,这仅仅是由于交换内存的工作原理(至少据我记得)。很容易,您的操作系统有时无法找到连续的 10GB 内存块,并且仍然同时将所有需要实际内存的进程保留在 RAM 中(此时您的 malloc 将失败)。
您是否真的需要 10GB 的连续内存,或者您是否能够将存储类/结构包装在几个较小的块周围并以块的形式使用内存?这放松了巨大的连续要求,并且还应该允许您的程序将交换文件用于较少使用的块。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)