malloc可以分配的最大内存空间是多少?

7

我的操作系统是64位的Arch Linux。

free -m命令的结果如下:

             总内存       已用内存       空闲内存     共享内存    缓冲区     缓存
内存:         32172      31909        262          0        119      13054
-/+ 缓冲区/缓存:      18735      13436
交换分区:          258        258          0
ulimit -a
核心文件大小          (块, -c) 无限制
数据段大小           (KB, -d) 无限制
进程调度优先级             (-e) 20
文件大小               (块, -f) 无限制
挂起信号                 (-i) 257329
最大锁定内存       (KB, -l) 64
最大内存大小         (KB, -m) 无限制
打开文件数                      (-n) 1024
管道大小            (512 字节, -p) 8
POSIX 消息队列     (字节, -q) 819200
实时优先级              (-r) 0
堆栈大小              (KB, -s) 8192
CPU 时间               (秒, -t) 无限制
最大用户进程数              (-u) 257329
虚拟内存          (KB, -v) 无限制
文件锁                      (-x) 无限制

内核选项overcommit_memory的值为0。

但是,当我尝试使用malloc分配2G字节时,失败了,原因是:无法分配内存?


1
malloc()的参数是SIZE_T,其范围为[0,SIZE_MAX]。 SIZE_MAX的值取决于实现,但您可能希望查看<limit.h>以查看适合您配置的限制。 - user740316
物理内存总大小为32GB,我之前成功分配了4GB。所以我认为2GB不会超出size_t的限制。 - user1817385
什么是“before”?你改变了什么可能会解释为什么无法重做此操作吗? - user740316
1
除了内核限制(您已经检查过了)之外,还有一件要检查的事情:查找像apparmor和SELinux这样的东西,我认为它们可以在这些东西中强制执行配额。此外,在Linux中总体上也要查找配额,您可能正在运行某种执行程序。最后,请尝试查看如果刷新缓存内存会发生什么。 - dsign
我已经检查了我的操作系统,AppArmor和SELinux已被禁用。 - user1817385
1个回答

3
它实际上可能是任何东西。之前可行的原因可能是因为空闲内存全部都是连续的,而现在空闲内存不是这样,或者可能是因为您的内存请求未通过正在使用的启发式算法。请参见此链接http://linuxtoolkit.blogspot.com/2011/08/tweaking-linux-kernel-overcommit.html了解有关打开overcommit知识的更多信息。基本上:0 = 系统启发式地确定是否允许过度承诺;1 = 总是过度承诺(即使超出地址范围,所以如果您问我,这相当愚蠢);2 = 从不超过某些限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接