无法用完备用内存

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 中指定某些标志来覆盖它。