C malloc:无法解释的内存使用情况

时间:2009-07-11 14:34:16

标签: c malloc

当我编译并运行以下代码时:(在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;

所以,实际上,而不是显示增加 显示下降。

有什么可以解释这个?

6 个答案:

答案 0 :(得分:7)

您已分配内存,使其可用,但尚未使用(从/向其读取或写入)。内存管理器可能还没有实际为你的程序分配物理内存,只是说你可以拥有它。如果你在刚刚分配的内存中写一些内容(例如用0填充它 - 看看memset),我希望内存使用量更符合你的预期。

答案 1 :(得分:4)

第二个malloc会分配1600MiB(检查你的单位)。我的猜测是,这不仅仅是你的系统可以在一个进程中容纳的,所以第二个malloc失败了。出于某种原因,即使malloc失败,您的应用程序中的其他内容也会产生很高的开销,导致内存使用率很高。

打印一个确定。

答案 2 :(得分:3)

不幸的是,内存消耗并不像单个一样简单。有许多方法需要跟踪内存(并且它在操作系统之间有所不同)。

例如在Windows上,这里有一些不同的内存使用类型

  • 虚拟内存
  • 物理记忆
  • Commited memory
  • 预留内存
  • 共享内存

您能否详细说明您正在谈论的是哪个号码?

一个可能的解释是您正在查看进程的物理内存使用情况。操作系统通常会分配虚拟内存地址,但不会将其提交到物理内存,直到您的进程实际使用它为止。

验证这一点的一种方法是设置一个写入数组中每个元素的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。这样,在写入数据之前,为进程分配的物理内存量不会增加。这通常仅适用于更大的分配。