我用C++写了测试代码:
void handler()
{
std::cout << "allocation failed" << std::endl;
std::set_new_handler(nullptr);
}
int main()
{
size_t allocations_count = 0u;
std::set_new_handler(handler);
try {
while (true) {
new char[1024u * 1024u * 1024u];
++allocations_count;
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
std::cout << "allocated " << allocations_count << " GB" << std::endl;
}
在我有 8GB RAM 的机器上,我得到了输出:
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
allocation failed
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
std::bad_alloc
allocated 130676 GB
我分配了 130676GB,我觉得太多了,因为我的存储大小是 500GB,我不认为虚拟内存可以为这个数量的内存提供服务...谁能解释为什么我可以在那里进行大量分配?
RAM = 8GB 存储空间 = 500GB MacBook Pro(13 英寸,M1,2020 年)
最佳答案
64 位可以寻址 9313225 GB 的内存。这比您分配的 130675 GB 高出一个数量级。
因此,即使操作系统保留了所有特殊地址范围,虚拟内存也可以轻松适应您分配的内存量。只要你不写入它,它就会包含零并且不需要存储在任何地方(注意,C++ 语言 new
不保证内存包含零,但显然允许 它)。
将您分配的内存初始化为非零,然后看看会发生什么。在 Linux 上,这会触发 OOM(内存不足) killer ,当操作系统用完物理内存和磁盘交换来存储数据时,它会开始终止进程。也许 OSX 做了类似的事情。
关于C++大内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72098115/