我的应用程序类似于hypotetical程序:

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%的可用物理内存)。这是正常的吗?

已更新 - 暂时使用内存然后将其释放。这有区别吗?

有帮助吗?

解决方案

尝试添加

  sbrk(-1);

在每个循环结束时查看它是否有所不同。

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

其他提示

行为正常。引用 man 3 malloc

BUGS

默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证        记忆真的可用。这是一个非常糟糕的错误。如果事实证明系统内存不足,则会有一个或多个进程        被臭名昭着的OOM杀手杀死。如果Linux在不太可能突然失去一些随机性的情况下使用        选择进程,而且内核版本是最新的,可以使用如下命令关闭这种过度使用的行为:

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

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

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

OS通常将所有页面分配为“0”的“写入时复制”克隆。 页面,这是一个用零填充的固定页面。从页面上阅读 将按预期返回0。只要你只阅读,所有引用都会去 相同的物理内存。一旦你写了一个值“COW”,是 打破并为您分配一个真实的物理页面框架。这个 意味着只要你不写入你可以保留的记忆 分配内存直到虚拟内存地址空间耗尽或 你的页面表填满了所有可用的内存。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top