4

我的应用程序类似于假设程序:

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

4 回答 4

10

行为是正常的。报价man 3 malloc

错误

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

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

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

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

于 2009-11-26T14:39:27.037 回答
1

尝试添加

  sbrk(-1);

在每个循环结束时,看看它是否有所作为。

free() 仅释放内存,但不会将其返回给操作系统。

于 2009-11-26T15:00:05.613 回答
1

操作系统通常将所有页面分配为“0”页面的 Copy-On-Write 克隆,即用零填充的固定页面。从页面读取将按预期返回 0。只要您只阅读,所有引用都会进入相同的物理内存。一旦你写了一个值,“COW”就会被破坏,并为你分配一个真实的、物理的页框。这意味着只要您不写入内存,您就可以继续分配内存,直到虚拟内存地址空间用完或您的页表填满所有可用内存。

于 2009-11-26T16:10:21.940 回答
0

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

于 2009-11-26T14:40:36.257 回答