为了测试内存不足行为,我使用GCC 4.7.1在32位Linux 3.2上编译了以下C程序,没有任何编译器标志:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
while (malloc(4096)) ;
printf("%s", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,我发现在分配了大约2.5 GB的驻留内存后,malloc失败("无法分配内存").
该机器具有2GB的物理内存和4GB的交换空间.在程序运行期间没有观察到内核消息.
那么为什么Linux停止发布内存呢?
相关问题:malloc可以分配的最大内存,但它没有解决Linux的细节问题.
机器中的物理内存量与语义无关malloc.进程具有固定的虚拟地址空间(对于32位进程通常为2GB).执行malloc将返回addreses,直到它耗尽虚拟地址空间而不是物理RAM.
这是一个更详细的讨论