代码之家  ›  专栏  ›  技术社区  ›  danatel

Linux上的虚拟内存是否可以用完?

  •  4
  • danatel  · 技术社区  · 15 年前

    我的应用程序类似于低血压程序:

    for(;;) {
      for (i=0; i<1000; i++) {
        p[i] = malloc(random_number_between_1000_and_100000());
        p[i][0]=0;  // update
       }
      for (i=0; i<1000; i++) {
        free(p[i]);
      }
    }
    

    没有内存泄漏,但是在我的系统上,内存消耗(顶部,列vss)会无限增长(例如,达到可用物理内存的300%)。这是正常的吗?

    更新的 -使用内存一段时间,然后释放它。这是区别吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   ZZ Coder    15 年前

    尝试添加

      sbrk(-1);
    

    在每个循环的末尾查看它是否有区别。

    free()只释放内存,但不返回给操作系统。

        2
  •  10
  •   OregonGhost    15 年前

    行为正常。引用 man 3 malloc :

    漏洞

    默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非空值时,不能保证 内存确实可用。这是一个非常糟糕的错误。如果系统内存不足,一个或多个进程将 被臭名昭著的房间杀手杀死。如果Linux是在不太希望突然失去一些随机的情况下使用的 选择的进程,而且内核版本足够新,您可以使用如下命令关闭这种过度授权行为:

           # echo 2 > /proc/sys/vm/overcommit_memory
    

    另请参阅内核文档目录、文件vm/overcommit accounting和sysctl/vm.txt。

    您需要触摸(读/写)Linux内核的内存来实际保留它。

        3
  •  1
  •   Per Knytt    15 年前

    操作系统通常将所有页面分配为“0”的copy-on-write克隆 page,这是一个用零填充的固定页。从页面阅读 将按预期返回0。只要你只看了,所有的参考资料都会消失。 相同的物理内存。一旦你写下一个值,“牛”就是 一个真正的,物理的,页面框架被分配给你。这个 这意味着只要你不写你能保存的记忆 分配内存,直到虚拟内存地址空间用完或 页表将填充所有可用内存。

        4
  •  0
  •   Arkaitz Jimenez    15 年前

    只要你不接触那些分配的块,系统就不会真正为你分配它们。
    但是,您可能会耗尽可寻址空间,这是操作系统对进程施加的限制,不一定是使用系统指针类型可以寻址的最大值。