我有以下控制台应用程序,其唯一目的是使用正在运行的计算机上的所有备用内存:
static List<string> _str = new List<string>();
static int fill = 10000;
static int _remainingMemory = 50;
static void Main(string[] args)
{
fillString();
Console.ReadLine();
}
static void fillString()
{
long count = 0;
while (true)
{
try
{
if (++count % 500 == 0 || fill == 1)
{
ShowMemory();
}
_str.Add(new string('_', fill));
}
catch (OutOfMemoryException)
{
if (fill > 1)
{
fill = 1;
}
else
{
Console.WriteLine("Not consuming memory...");
return;
}
}
}
}
private static void ShowMemory()
{
System.Diagnostics.PerformanceCounter ramCounter;
ramCounter = new System.Diagnostics.PerformanceCounter("Memory", "Available MBytes");
Console.WriteLine("Memory Remaining: {0}", ramCounter.RawValue);
}
这样做可以耗尽大约1GB的内存,但是可以节省近10GB的内存。所以,我的问题是,为什么这段代码不会耗尽机器上的每一个内存字节并使其停滞不前?
我在Windows 8.1下使用VS2015。
答案 0 :(得分:2)
您的应用程序不直接使用内存。它使用虚拟内存。操作系统将其映射到内存页面。不要考虑记忆。默认情况下考虑地址空间,因为这是您的应用程序可用的抽象。
如果您的应用是32位,默认情况下限制为2 GB虚拟内存。如果它是大地址识别,它可以分别在32位Windows / 64位Windows上访问3或4 GB。
如果您的应用是64位,则可用地址空间为8 TB。这很可能受到操作系统通过页面支持的能力的限制(至少有一段时间)。
答案 1 :(得分:1)
Windows设置内存的每进程限制。除非您在Windows中指定某些标志来覆盖此属性,否则虚拟地址空间限制为2GB。