我的应用程序类似于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%的可用物理内存)。这是正常的吗?
已更新 - 暂时使用内存然后将其释放。这有区别吗?
答案 0 :(得分:10)
行为正常。引用man 3 malloc
:
BUGS
默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证 记忆真的可用。这是一个非常糟糕的错误。如果事实证明系统内存不足,则会有一个或多个进程 被臭名昭着的OOM杀手杀死。如果Linux在不太可能突然失去一些随机性的情况下使用 选择进程,而且内核版本是最新的,可以使用如下命令关闭这种过度使用的行为:
# echo 2 > /proc/sys/vm/overcommit_memory
另请参阅内核文档目录,文件vm / overcommit-accounting和sysctl / vm.txt。
您需要触摸(读/写)Linux内核的内存以实际保留它。
答案 1 :(得分:1)
尝试添加
sbrk(-1);
在每个循环结束时查看它是否有所不同。
free()仅释放内存,但不会将其返回给操作系统。
答案 2 :(得分:1)
操作系统通常将所有页面分配为“0”的Copy-On-Write克隆 页面,这是一个用零填充的固定页面。从页面上阅读 将按预期返回0。只要你只阅读,所有引用都会去 相同的物理内存。一旦你写了一个值,“COW”就是 打破并为您分配一个真实的物理页面框架。这个 意味着只要你不写入你可以保留的记忆 分配内存直到虚拟内存地址空间耗尽或 你的页面表填满了所有可用的内存。
答案 3 :(得分:0)
只要您不触摸那些已分配的块,系统就不会真正为您分配它们 但是,您可以耗尽可寻址空间,这是操作系统对进程施加的限制,并且不一定是系统指针类型可以解决的最大空间。