.Net为什么我不能在x64进程中获得超过11GB的已分配内存?

Jef*_*Cyr 16 .net memory-management process

我认为64位进程的最大用户空间是8TB,但我做了一点测试,我可以得到的最大值是10-11GB.

注意:我在一个过程中不需要那么多内存,我只是想了解为什么出于好奇.

这是我的测试程序:

static void Main(string[] args)
{
    List<byte[]> list = new List<byte[]>();

    while (true)
    {
        Console.WriteLine("Press any key to allocate 1 more GB");
        Console.ReadKey(true);
        list.Add(new byte[1024 * 1024 * 1024]);

        Console.WriteLine("Memory size:");
        double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64 / (double)(1024 * 1024 * 1024);
        Console.WriteLine(memoryUsage.ToString("0.00") + " GB");
        Console.WriteLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

将测试程序更新为更具确定性.

要接受答案,我想知道如果8TB仅是理论上,如何​​计算实际最大分配内存.

cod*_*zen 8

这是你的机器.

我有一个带有8GB RAM和12GB页面文件的x64,我运行你的程序,它最高为16.23GB.

EPILOG:然后我的Win7安装逐渐陷入昏迷状态,因为关键过程显然是内存匮乏.

编辑:如果你想了解Windows如何分配(即保留和提交)内存,请阅读:http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx和这:http:/ /blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx

由于.Net依赖于Windows来管理它用于构建GC堆的内存,因此Windows执行此操作的机制反映在内存在.Net中的低级别分配方式.


joe*_*moe 5

高达 8 TB,而不是8 TB.您最多可能有8 TB,但您需要匹配的RAM /交换文件.

  • @earlz-运行时已经分配了引发该异常的内存。 (2认同)