我的一个主要应用是在运行时崩溃。
我想知道这是否与系统的内存分配问题有关。因此,我创建了一个小型测试程序来分配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;
}
答案 0 :(得分:14)
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。将任务管理器置于程序员模式,添加Commit size列。这是真实的数字。
答案 1 :(得分:8)
尝试在大数组中存储数据。 Memset会很好。 你可能正在查看实际内存,如果你不触摸它们,这些仍然只能在虚拟记忆中。
答案 2 :(得分:1)
也许操作系统过度使用,我。例如,operator new
返回一个有效的(非NULL
)指针,尽管内存不足。尝试实际将内容写入所获得的内存,并且您的进程可能会被终止(或至少物理内存使用率上升)。
答案 3 :(得分:1)
操作系统(无论是Windows,Linux还是MacOS)都不希望所有分配内存的进程实际使用所有内存。很多程序都会做一些事情,例如分配1MB来保存文件,然后用14KB的文件数据填充它(因为它比确定文件大小和实际分配正确数量更容易)。因此,不是通过实际制作可用于未使用的内存的真实物理内存页面的所有努力,而是将其分配在虚拟空间中,然后在实际使用内存时找到一些物理内存。
因此,任务管理器中显示的内存量仅是您正在使用的实际内存,而不是您已分配但从未使用过的内存。
如果你写一个循环写入你的分配中的每个第256或第1024个字节,它应该“增长”并显示你实际分配的内存量。
答案 4 :(得分:0)
http://en.wikipedia.org/wiki/Virtual_memory
您实际上是在使用数据填充页面文件。操作系统发现您正在分配大量数据,但在使用之前,这些数据不会从页面文件中提取到主内存中。