【问题标题】:The max size malloc can allocate?malloc 可以分配的最大大小?
【发布时间】:2012-10-31 15:05:04
【问题描述】:

我的操作系统是 arch linux 64 位。

free -m 结果如下

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

kenerl 选项 overcommit_memroy 为 0

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

【问题讨论】:

  • malloc() 参数是一个 SIZE_T,其范围是 [O,SIZE_MAX]。 SIZE_MAX 的值取决于实现,但您可能需要查看 以查看适合您的配置的限制。
  • 物理内存的总大小是32GB,我之前已经分配成功了4GB。所以我认为2GB并没有超出size_t的限制。
  • 什么是“之前”?您是否更改了任何可以解释为什么您无法重做此操作的内容?
  • 除了内核限制(您已经做过)之外,还有一件事要检查:寻找 apparmor 和 SELinux 之类的东西,我认为他们可以在这些东西中强制执行配额。还要在linux中寻找一般的配额,你可能有某种执行器正在运行。最后尝试看看如果你刷新缓存的内存会发生什么。
  • 我已经检查了我的操作系统、应用程序装甲和 Selinux 已禁用

标签: c linux-kernel


【解决方案1】:

实际上,它可以是任何东西。以前可能因为空闲内存都是连续的,而现在空闲内存不是连续的,或者可能是您的内存请求未能使用启发式算法。

请在此处查看此链接 - http://linuxtoolkit.blogspot.com/2011/08/tweaking-linux-kernel-overcommit.html - 了解有关了解过量使用的更多信息。

基本上:

  • 0 = 系统试探性地确定是否允许过度使用
  • 1 = 总是过度使用(即使超出地址范围,如果你问我,这很愚蠢)
  • 2 = 永远不要过度使用过去的某些限制

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多