【问题标题】:Why is malloc not "using up" the memory on my computer?为什么 malloc 没有“用完”我计算机上的内存?
【发布时间】:2013-11-28 06:54:45
【问题描述】:

所以我有一个分配 256 MB 内存的程序,在用户按下 ENTER 后,它会释放内存并终止。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *p, s[2];

    p = malloc(256 * 1024 * 1024);
    if ( p == NULL) 
        exit(1);

    printf("Allocated"); 
    fgets(s, 2, stdin);
    free(p);
    return 0;
}

我多次运行这个程序,并将每个程序都设置为后台,直到没有足够的内存可以分配。然而,这永远不会发生。我运行了一个 linux top 命令,即使在多次运行该程序后,可用内存也从未减少近 256 MB。

但是,另一方面,如果我使用calloc 而不是malloc,那么会有很大的不同:

p = calloc(256 * 1024 * 1024, 1);

现在,如果我运行该程序并将其置于后台,然后重复,每次运行它时,可用内存都会减少 256 MB。为什么是这样?为什么malloc 不会导致可用内存发生变化,而calloc 会?

【问题讨论】:

  • 通过 strace 运行程序,看看它做了什么。 (我希望 both 版本可以匿名映射 /dev/zero,顺便说一句)
  • 简短而过于简单的答案是,由于您实际上还没有使用来自malloc 的内存,因此计算机还不需要实际将其提供给您。但是使用calloc,需要使用内存(用于归零部分),因此计算机实际上需要为您提供所有内存。
  • topfree 命令的“可用内存”数字毫无意义。他们充其量只是在告诉您缓存效率。实际有意义的数字,提交费用,可以在/proc/meminfo 中作为Committed_AS: 行找到。
  • @DennisMeng:这仅适用于extremely primitive calloc implementations - 但Ryan 显然正在使用其中之一。例如,BSD omalloc 通常不访问内存。

标签: c linux memory-management malloc


【解决方案1】:

malloc()使用内存。它分配它。

分配内存后,通过分配一些数据来使用它。

size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
  memset(p, 123, Size);
}

某些平台实现malloc() 的方式是,在访问该字节(或更可能是一组字节或字节“页”中的一个字节)之前不会发生内存的物理消耗。

calloc() 也可能真正使用内存。系统可以将大量内存映射到相同的物理归零内存,至少在数据变得有趣之前是这样。看 Why malloc+memset is slower than calloc?

【讨论】:

  • 123是你的幸运数字吗? 256 MB of 123 123 123 123……一定很幸运!
  • 应该是42
【解决方案2】:

您系统上的calloc 实际上通过清除它来触及内存,并且在许多系统上,内存在被分配给它的进程触及之前并没有真正分配(因此“用完”)。因此,在您使用内存之前,仅执行 malloc 不会“使用”内存。

† 见 cmets

【讨论】:

  • 我认为calloc() 也可以在某些系统上作弊stackoverflow.com/questions/2688466/…
  • @chux 有趣,我不知道,谢谢你的链接。 (与此同时,提问者确实发现 callocmalloc 在他们的系统和参数上有所不同。)
  • 同意。它并不为人所知,当然也不适用于 OP 的情况。那些鬼鬼祟祟的操作系统小精灵!
【解决方案3】:

内存可能并不真正可用,尤其是您在示例中没有使用p 执行任何操作,除了检查它是否为NULL。来自man malloc

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当malloc() 返回非NULL 时,不能保证内存确实可用。如果发现系统内存不足,OOM 杀手将杀死一个或多个进程。更多信息请参见proc(5)中对/proc/sys/vm/overcommit_memory/proc/sys/vm/oom_adj的描述,以及Linux内核源文件文档/vm/overcommit-accounting

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2015-09-24
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多