当我编译并运行以下代码时:(在cygwin上使用gcc)
int *a = malloc(1024*1024*100*sizeof(int));
while(1)
;
Windows XP中的任务管理器显示 此进程的内存使用量为2232K, 根据我的说法应该是40万左右。
当我编译并运行以下代码时:(在cygwin上使用gcc)
int *a = malloc(1024*1024*400*sizeof(int));
while(1)
;
内存使用量降至1388K;
所以,实际上,而不是显示增加 显示下降。
有什么可以解释这个?
答案 0 :(得分:7)
您已分配内存,使其可用,但尚未使用(从/向其读取或写入)。内存管理器可能还没有实际为你的程序分配物理内存,只是说你可以拥有它。如果你在刚刚分配的内存中写一些内容(例如用0填充它 - 看看memset),我希望内存使用量更符合你的预期。
答案 1 :(得分:4)
第二个malloc会分配1600MiB(检查你的单位)。我的猜测是,这不仅仅是你的系统可以在一个进程中容纳的,所以第二个malloc失败了。出于某种原因,即使malloc失败,您的应用程序中的其他内容也会产生很高的开销,导致内存使用率很高。
打印一个确定。
答案 2 :(得分:3)
不幸的是,内存消耗并不像单个一样简单。有许多方法需要跟踪内存(并且它在操作系统之间有所不同)。
例如在Windows上,这里有一些不同的内存使用类型
您能否详细说明您正在谈论的是哪个号码?
一个可能的解释是您正在查看进程的物理内存使用情况。操作系统通常会分配虚拟内存地址,但不会将其提交到物理内存,直到您的进程实际使用它为止。
验证这一点的一种方法是设置一个写入数组中每个元素的for循环,然后检查应用程序的内存使用情况。
答案 3 :(得分:0)
在 http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html讨论了在cygwin下使用malloc和gcc的可分配内存问题。
检查malloc的返回值也很好。
答案 4 :(得分:0)
如果启用了优化且实际未使用a,则将删除变量和分配。您可以通过将变量声明为volatile来避免这种情况。
答案 5 :(得分:0)
http://en.wikipedia.org/wiki/Copy-on-write
另一个用途是在calloc函数中。这可以通过使用零填充的物理存储器页面来实现。分配内存时,返回的页面都是指零的页面,并且都标记为copy-on-write。这样,在写入数据之前,为进程分配的物理内存量不会增加。这通常仅适用于更大的分配。