4

我的一个主要应用程序在运行时崩溃。

我想知道这是否与系统的内存分配问题有关。因此,我创建了一个小型测试程序来分配 1GB 的内存并同时运行 15 个这样的进程,因此总共使用了 15GB 的 RAM。

但是,当我运行这个程序时,任务管理器显示它只占用了 2GB 的 RAM?这怎么可能?

我写了一个示例代码如下

char *ptr[1024];
for ( i = 0 ; i < 1024 ; ++i )
{
    ptr[i] = new char[1024 * 1024];
    std::cout << " Allocated 1024 MB" << i << " th time " << std::endl;
}
4

5 回答 5

13

Windows 是一种按需分页的虚拟内存操作系统。使用 operator new 分配内存只会分配虚拟内存。在实际访问内存之前,您不会开始使用物理内存 RAM 。你没有这样做。

您可以通过触摸每 4096 个字节来强制分配 RAM,最好进行写入,否则它将被优化掉:

    size_t size = 1024 * 1024;
    ptr[i] = new char[size];
    for (size_t j = 0; j < size; j += 4096) ptr[i][j] = 0;

但这是一件毫无意义的事情,它只会减慢你的程序。并且实际上并没有测试任何东西,进程不能在 Windows 上耗尽 RAM。将任务管理器置于程序员模式,添加提交大小列。那是真实的数字。

于 2013-08-23T21:11:13.090 回答
8

尝试将数据存储在您的大数组中。Memset 会做得很好。如果您不触摸它,您可能正在查看实际内存,这些可能仍然仅在虚拟内存中。

于 2013-08-23T21:07:11.913 回答
1

也许操作系统过度使用,即operator new返回一个有效的(非NULL)指针,尽管没有足够的内存。尝试实际向获得的内存写入一些内容,您的进程可能会被杀死(或者至少物理内存使用量上升)。

于 2013-08-23T21:15:04.717 回答
1

操作系统(无论是 Windows、Linux 还是 MacOS)并不期望所有分配内存的进程都实际使用所有内存。许多程序会分配 1MB 来保存文件,然后用 14KB 的文件数据填充它(因为这比弄清楚文件有多大并实际分配正确的数量要容易)。因此,与其费力地让一个真正的物理内存页面可用于可能未使用的内存,它只是将其分配在虚拟空间中,然后在实际使用内存时找到一些物理内存。

因此,任务管理器中显示的内存量只是您正在使用的实际内存,而不是您分配但从未使用过的内存。

如果您编写一个循环写入分配中的每 256 或 1024 个字节,它应该“增长”并显示您实际分配的内存量。

于 2013-08-23T21:39:12.637 回答
0

http://en.wikipedia.org/wiki/Virtual_memory

您实际上是在用数据填充页面文件。操作系统看到您正在分配大量数据,但在您使用它之前,这些数据不会从页面文件中拉到主内存中。

于 2013-08-23T21:17:28.203 回答