将值分配给大型数组时,即使没有分配新内存,使用的内存也会不断增加。我只是通过任务管理器(Windows)或系统监视器(Ubuntu)来检查已用内存。
两个操作系统的问题都是一样的。我分别使用gcc 4.7或4.6。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i,j;
int n=40000000; //array size
int s=100;
double *array;
array=malloc(n*sizeof(double)); //allocate array
if(array==NULL){
return -1;
}
for(i=0;i<n;i++){ //loop for array, memory increases during this loop
for(j=0;j<s;j++){ //loop to slow down the program
array[i] = 3.0;
}
}
return 0;
}
我没有看到任何逻辑问题,但据我所知,我也没有超出任何系统限制。所以我的问题是:
问题可以被其他人复制吗?
记忆力增长的原因是什么?
如何解决此问题?
答案 0 :(得分:5)
当现代系统“分配”内存时,页面实际上并未在物理RAM中分配。您将获得虚拟内存分配。当您写入这些页面时,将采用物理页面。因此,当您执行malloc()
时,所采用的虚拟RAM将会增加,但只有在您写入值时才会采用物理RAM(逐页)。
答案 1 :(得分:3)
您应该看到使用的虚拟内存会立即增加。之后,当您写入新分配的内存时,RSS或实际内存将会增加。有关更多信息,请访问How to measure actual memory usage of an application or process?
这是因为在您使用它之前,在Linux和许多其他操作系统上分配的内存实际上并没有提供给您的程序。
因此,您可以在256 MB计算机上使用malloc 1 GB,并且在实际尝试使用所有1 GB之前不会耗尽内存。
在Linux中,有一组过度使用设置会更改此行为。见Cent OS: How do I turn off or reduce memory overcommitment, and is it safe to do it?