Malloc分配的内存多于RAM

我刚刚在一台12 MB的机器上执行了一个mallocs 13 MB的程序(QEMU Emulated!)。 不仅如此,我甚至浏览了记忆并填充了垃圾……

void large_mem(void) { #define LONGMEM 13631488 long long *ptr = (long long *)malloc(LONGMEM); long long i; if(!ptr) { printf("%s(): array allocation of size %lld failed.\n",__func__,LONGMEM); ASSERT(0); } for(i = 0 ; i < LONGMEM ; i++ ) { *(ptr+i)=i; } free(ptr); } 

这怎么可能 ? 我期待一个分段错误。

它被称为虚拟内存 ,为您的程序分配。 这不是你称之为RAM的真实记忆。

虚拟内存也有最大限制,但它高于RAM。 它由您的操作系统实现(和定义)。

这称为惰性分配。

大多数类似Linux的操作系统都有一个惰性分配内存模型,其中返回的内存地址是一个虚拟地址,实际分配只在访问时发生。 操作系统假定它能够在访问时提供此分配。

在程序实际触摸它之前, malloc分配的内存不受实际内存的支持。

同时,由于calloc将内存初始化为0,因此可以确保操作系统已经使用实际RAM(或交换)支持分配。

尝试使用calloc ,除非你的交换文件/分区大到足以满足请求,否则它很可能会让你内存不足。

听起来你的操作系统正在交换页面 :

在大多数现代通用操作系统中,分页是虚拟内存实现的重要部分,允许它们将磁盘存储用于不适合物理随机存取存储器(RAM)的数据。

换句话说,操作系统正在使用你的一些硬盘空间来满足你的13 MB分配请求(以极高的速度开支,因为硬盘比RAM 得多)。

除非虚拟化操作系统具有交换可用性,否则您遇到的内容称为overcommit ,它基本上存在,因为在具有虚拟内存和请求/写入时复制页面的系统中管理资源的简单方法不是管理它们。 过度使用就像一家银行借出的钱多于实际拥有的东西 – 似乎工作了一段时间,然后事情就崩溃了。 在设置Linux系统时,您应该做的第一件事是使用以下命令解决此问题:

 echo "2" > /proc/sys/vm/overcommit_memory 

这只会影响当前运行的内核; 您可以通过在/etc/sysctl.conf添加一行来使其永久化:

 vm.overcommit_memory=2