当仍有大量交换时,malloc失败

3 c linux memory system-calls

为了测试内存不足行为,我使用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的细节问题.

Jar*_*Par 9

机器中的物理内存量与语义无关malloc.进程具有固定的虚拟地址空间(对于32位进程通常为2GB).执行malloc将返回addreses,直到它耗尽虚拟地址空间而不是物理RAM.

这是一个更详细的讨论

http://en.wikipedia.org/wiki/Virtual_address_space

  • 对于x86上的32位Linux,用户代码的地址空间为3 GB.考虑到文本(代码),BSS,堆栈等的地址空间,您可以大致达到提到的2.5 GB限制. (5认同)