代码之家  ›  专栏  ›  技术社区  ›  Jeff Cyr

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

  •  16
  • Jeff Cyr  · 技术社区  · 16 年前

    我以为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只是理论上的,那么实际的最大分配内存是如何计算的。

    4 回复  |  直到 16 年前
        1
  •  5
  •   joemoe    16 年前

    它是 高达 8 TB,而不是8 TB。您可能有多达8 TB的容量,但您需要匹配的RAM/swapfile。

        2
  •  8
  •   codekaizen    16 年前

    这是你的机器。

    我有一个带有8GB内存和12GB页面文件的X64,我运行了您的程序,它的最大容量是16.23GB。

    尾声 :然后我的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中如何在较低的级别上分配内存。

        3
  •  1
  •   Nick Larsen    16 年前

    我猜是因为你使用的是一个列表,我认为它有一个内部限制。

    如果你尝试创建自己的旧学校列表,看看能得到什么:

    public class ListItem<T>
    {
        public ListItem Parent;
        public T Value;
    
        public ListItem(ListItem<T> parent, T item)
        {
            this.Parent = parent;
            this.Value = item;
        }
    }
    

    我以前写过几乎完全相同的代码(只有我的项目是一个int),并在一台有32个处理器和128GB内存的机器上运行它,它总是以相同的大小出现,不管是什么,它总是与int32.maxvalue相关的,希望能有所帮助。

        4
  •  1
  •   user113476    16 年前

    尝试分配一个块(与1MB块列表相反):

    Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024 ^ 3)))
    

    编辑 -鉴于您的评论,您只有4GB的物理内存,您实际上没有业务分配>~8GB,甚至这也在推动它的发展。

    编辑 -

    为了接受一个答案,我想知道如果8TB只是理论上的,那么实际的最大分配内存是如何计算的。

    您可以分配的最大RAM数量可能等于(页面文件大小-RAM中所有内容的大小 除了 不能或不会被分页的内容)+(物理RAM大小-不能或不会被分页的内容的大小,即保持系统运行所需的内容…内核,驱动程序,.net内容等…)

    当然,页面文件可以增长…

    迟早,从磁盘到磁盘的分页会变得非常频繁,而您的系统会变得缓慢,无法使用。

    阅读Mark Russinovich的博客: