我创建了一个非常简单的程序,并将计算机设置为具有有限的虚拟内存。 32GB RAM和4GB虚拟内存。然后,我制作了C#代码以消耗所有的.NET内存。
List<HeapSizeAllocation> hsaList = new List<HeapSizeAllocation>();
public class HeapSizeAllocation
{
int[] _arr;
int s1Gb = ( 1024 * 1024 * 1024) /sizeof(int); //1GB = 1024MB 1MB= 1024Kb
public void Test()
{
//Test simple array allocation
_arr = new int[s1Gb * 2];
}
}
Click()=>重复执行,直到内存不足
HeapSizeAllocation hsa = new HeapSizeAllocation();
hsaList.Add(hsa);
hsa.Test();
然后,我在Windows中打开TaskManager,仍然看到21 GB的可用空间,只有10 GB的空间正在使用。为什么?
答案 0 :(得分:1)
您通过“系统属性”设置指定的4 GB实际上是允许的页面文件的大小。不幸的是,该设置称为“虚拟内存”,因为它与虚拟内存的真正含义造成了混淆。
需要牢记的两个重要事项:
Platform target
默认设置,用于在x64 Windows盒子上使用Visual Studio构建的C#项目的进程的默认虚拟地址空间将被限制为4 GB。您必须更改此设置(例如,针对x64平台进行编译)才能看到更多的使用情况我写了一篇专门针对您所引用的场景的文章(在具有大量RAM的计算机上抛出的内存不足,但仍有大量内存可用)here。它详细解释了事情。