2

当我编译并运行以下代码时:(在 cygwin 上使用 gcc)

int *a = malloc(1024*1024*100*sizeof(int));
while(1)
;

Windows XP 中的任务管理器显示此进程的内存使用量为 2232K,据我说应该在 400000K 左右。

当我编译并运行以下代码时:(在 cygwin 上使用 gcc)

int *a = malloc(1024*1024*400*sizeof(int));
while(1)
;

内存使用量下降到 1388K;

因此,它实际上并没有显示出增加,而是显示出下降。

这有什么可以解释的?

4

6 回答 6

7

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

于 2009-07-11T14:38:29.617 回答
4

第二个 malloc 将分配 1600MiB(检查您的单位)。我的猜测是,这超出了您的系统在单个进程中所能容纳的范围,因此第二个 malloc 失败了。出于某种原因,即使 malloc 失败,您的应用程序中的其他东西也会导致内存使用率很高。

打印一个确定。

于 2009-07-11T14:40:16.977 回答
3

不幸的是内存消耗并不像单次那么简单。需要跟踪内存的方式有很多种(操作系统之间略有不同)。

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

  • 虚拟内存
  • 物理内存
  • 提交的内存
  • 保留内存
  • 共享内存

你能告诉我们更多关于你所说的数字的细节吗?

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

验证这一点的一种方法是设置一个 for 循环,该循环写入数组中的每个元素,然后检查应用程序的内存使用情况。

于 2009-07-11T14:39:33.920 回答
0

在 cygwin 下使用 malloc 和 gcc 分配内存的问题在讨论http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html

检查 malloc 的返回也很好。

于 2009-07-11T14:47:56.807 回答
0

如果您启用了优化并且没有实际使用 a,则变量和分配都将被删除。您可以通过将变量声明为 volatile 来避免这种情况。

于 2009-07-11T17:22:40.940 回答
0

http://en.wikipedia.org/wiki/Copy-on-write

另一个用途是在 calloc 函数中。这可以通过用零填充物理内存页来实现。分配内存时,返回的页面都指向零页面,并且都标记为写时复制。这样,在写入数据之前,为进程分配的物理内存量不会增加。这通常只针对较大的分配进行。

于 2009-07-14T10:38:48.477 回答