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

标签 .net process memory-management

我以为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();
    }
}


编辑:

更新了测试程序,使其更具确定性。

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

最佳答案

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

关于.net - .Net为什么在x64进程中不能获得超过11GB的已分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2052019/

相关文章:

C# - 关闭子进程的输入流

java - 如果所有对象都在使用中,垃圾收集器将如何处理

linux - Tracker-extract 和 Tracker-store 进程消耗大量 RAM

memory-management - 如何更改 Linux 内核交换守护进程 (kswapd) 超时?

android - onDestroy() 或 finish() 是否真的终止了 Activity ?

java - 当已指定最大堆值时,是否有解决 "Java heap space"内存错误的解决方法?

.net - 格式化文本的复制粘贴如何工作?

c# - NLog 正在跳过日志消息。 .NET 问题?多线程问题?

c++ - 如何在 C++ 中获取使用 system() 命令执行的进程的 pid

在 C Linux 中创建多个守护进程并在它们之间进行通信