无法用尽备用内存

时间:2015-07-07 16:48:37

标签: c# memory out-of-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。

2 个答案:

答案 0 :(得分:2)

您的应用程序不直接使用内存。它使用虚拟内存。操作系统将其映射到内存页面。不要考虑记忆。默认情况下考虑地址空间,因为这是您的应用程序可用的抽象。

如果您的应用是32位,默认情况下限制为2 GB虚拟内存。如果它是大地址识别,它可以分别在32位Windows / 64位Windows上访问3或4 GB。

如果您的应用是64位,则可用地址空间为8 TB。这很可能受到操作系统通过页面支持的能力的限制(至少有一段时间)。

答案 1 :(得分:1)

Windows设置内存的每进程限制。除非您在Windows中指定某些标志来覆盖此属性,否则虚拟地址空间限制为2GB。