无法用完备用内存
Unable to use up spare memory
我有以下控制台应用程序,其唯一目的是使用 运行 机器上的所有备用内存:
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
您的应用程序不直接使用内存。它使用虚拟内存。 OS 将其映射到内存页面。不要考虑内存。默认情况下考虑地址 space,因为这是您的应用程序可用的抽象。
如果您的应用程序是 32 位的,则默认限制为 2 GB 虚拟内存。如果它是大地址感知的,它可以分别在 32 位 Windows/64 位 Windows 上访问 3 或 4 GB。
如果您的应用是 64 位的,可用地址 space 是 8 TB。这很可能会受到您 OS 支持页面的能力的限制(无论如何至少有一段时间)。
Windows 设置每个进程的内存限制。您的应用程序的虚拟地址 space 限制为 2GB,除非您在 windows 中指定某些标志来覆盖它。
我有以下控制台应用程序,其唯一目的是使用 运行 机器上的所有备用内存:
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您的应用程序不直接使用内存。它使用虚拟内存。 OS 将其映射到内存页面。不要考虑内存。默认情况下考虑地址 space,因为这是您的应用程序可用的抽象。
如果您的应用程序是 32 位的,则默认限制为 2 GB 虚拟内存。如果它是大地址感知的,它可以分别在 32 位 Windows/64 位 Windows 上访问 3 或 4 GB。
如果您的应用是 64 位的,可用地址 space 是 8 TB。这很可能会受到您 OS 支持页面的能力的限制(无论如何至少有一段时间)。
Windows 设置每个进程的内存限制。您的应用程序的虚拟地址 space 限制为 2GB,除非您在 windows 中指定某些标志来覆盖它。