2009-11-26 43 views
4

我类似hypotetical程序应用:我可以在Linux上用完虚拟内存吗?

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

试着真正地访问块,否则不能保证它们已被分配。 – 2009-11-26 14:41:01

回答

1

尝试添加

sbrk(-1); 

在每个循环的结束,看看它使不同。

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

9

这种行为是正常的。引用man 3 malloc

BUGS

默认情况下,Linux遵循一个乐观的内存分配策略。这意味着当malloc()返回非NULL时,不能保证内存真的可用。这是一个非常糟糕的错误。如果事实证明系统内存不足,一个或多个进程将被臭名昭着的OOM杀手杀死。

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

:在情况下,采用Linux的情况下这将是不太理想一下子失去了一些随机 挑选过程,而且内核版本是足够近,可以使用如下命令关闭此造成过度行为另请参阅内核文档目录,文件vm/overcommit-accounting和sysctl/vm.txt。

您需要触摸(读取/写入)Linux内核的内存才能真正保留它。

+3

当然,技术上vm overcommit是一个功能,而不是一个错误。它可以被禁用,或者不那么乐观。 – MarkR 2009-11-26 16:23:41

+0

我第一次遇到这个问题是8年前,当我的朋友在配备128MB RAM的机器上分配1GB的时候。一切都完美无瑕,直到有人决定查看他的源代码。我们都很困惑,但最终找到了overcommit_memory功能。 – Alexandru 2009-11-26 16:31:00

0

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

1

操作系统通常将所有页面分配为“0” 页面的写时复制克隆,即填充零的固定页面。按照预期从 页面读取将返回0。只要你只读,所有的引用去 相同的物理内存。一旦你写了一个值,“COW”就是 损坏,并为你分配一个真实的物理页面框架。这 意味着只要你不写入内存,你可以保留 分配内存,直到虚拟内存地址空间用完或 你的页表填满所有可用内存。