代码之家  ›  专栏  ›  技术社区  ›  Stefan Schultze

在32位中分配超过1000 MB的内存。NET进程

  •  21
  • Stefan Schultze  · 技术社区  · 16 年前

    我想知道为什么我无法在32位中分配超过1000 MB的内存。NET进程。以下迷你应用程序在分配了1000 MB后抛出OutOfMemoryException。为什么是1000 MB,而不是1.8 GB?我可以更改整个流程的设置吗?

    static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        int i = 0;
        while (true)
        {
            list.Add(new byte[1024 * 1024 * 10]); // 10 MB
            i += 10;
            Console.WriteLine(i);
        }
    }
    

    7 回复  |  直到 16 年前
        1
  •  18
  •   Marc Gravell    16 年前

    拥有巨大的内存块从来都不是一个好主意,即使是64位。连续内存和碎片会带来很大的问题。

    这里的问题是找到一个连续的块。您可以尝试启用3gb模式(这可能有助于它找到更多字节),但我 真的 建议不要这样做。答案如下:

    • 使用数据库/文件系统
    • 使用x64

    您可能还想阅读 Eric Lippert's

        3
  •  4
  •   CaptainBli    7 年前

    我最近一直在围绕内存限制进行广泛的分析。NET在32位进程上运行。我们都会被这样一个想法轰炸,即我们可以在一个内存中分配高达2.4GB(2^31)的内存。NET应用程序,但不幸的是,事实并非如此:(.应用程序进程有那么多的空间可供使用,操作系统在为我们管理它方面做得很好,然而,.NET本身似乎有自己的开销,对于推动内存限制的典型实际应用程序来说,这大约占600-800MB。这意味着,一旦你分配了一个大约1.4GB的整数数组,你应该会看到OutOfMemoryException()。

    我希望这个见解能有所帮助。

    我最初在这里回答了一些相关的问题(我还是新手,所以不知道该怎么做这些链接):

    Is there a memory limit for a single .NET process

        4
  •  0
  •   GeoffreyG    8 年前

    通过将应用程序构建为64位体系结构,您可以分配比2 GB更多的内存,这需要您在Visual Studio中创建新的构建配置,并且应用程序的构建只能在64位版本的Windows上运行。在。NET,使用应用程序的默认“Any CPU”构建选项,我发现我只能从堆中分配大约1.5 GB的内存(即使在64位Windows机器上),这是因为当应用程序在“Any CPU”模式下构建时,它实际上只在32位模式下运行。但是通过编译到x64架构,您可以在应用程序执行期间从堆中分配更多的内存,我将在下面解释如何为您的应用程序创建x64版本:

    1. 在Visual Studio的“解决方案资源管理器”窗格中,右键单击解决方案图标,然后从弹出菜单中选择“配置管理器”选项。这将打开的构建“配置管理器”对话框窗口。NET解决方案文件。
    2. 在构建“Configuration Manager”对话框的右侧顶部,单击向下箭头并选择“<ltnew>”选项。这将打开“新建解决方案平台”对话框。
    3. 在CS项目属性窗口的左侧,单击“构建”选项卡以显示代码项目的构建属性。在此窗口的顶部,请注意“平台”现在应该显示“x64”(而不是默认的“任何CPU”选项)。如果“平台”下拉菜单没有显示“x64”,您现在应该选择它。
    4. 然后只需构建代码,在“bin”文件夹中,您现在应该有一个x64文件夹,其中包含应用程序的新64位版本。

    在64位Windows操作系统上使用64位版本的应用程序将允许您的程序分配超过约2GB的内存,可能高达2^64个地址空间(如果您有可用的RAM和磁盘空间,这是截至编写此响应时的真正限制因素)。

    如果应用程序中的内存仍然不足,您还可以增加Windows内存页文件的大小。在Windows上,如果RAM内存空间不足,页面文件允许操作系统将内存从RAM转移到磁盘。但是,在磁盘之间来回移动RAM内存部分需要花费大量时间,因此这可能会对应用程序的性能产生真正的影响。无论性能如何,通过增加页面大小,您可以(理论上)使页面文件与windows计算机C:驱动器上的可用空间一样大。在这种情况下,您的应用程序将能够在程序执行期间分配高达4TB的内存(或页面文件大小设置的任何内存量)。要更改Windows计算机的页面文件设置,请执行以下操作:

    1. 在“系统属性”对话框的“高级”选项卡上,单击“性能”框中的“设置”按钮。这将打开“性能选项”对话框。
    2. 在“性能选项”对话框中,单击“高级”选项卡查看Windows内存页文件的当前大小设置。
    3. 在“虚拟内存”对话框中,选择“C:”驱动器,然后在“自定义大小”下设置“初始”和“最大”大小。您可以使用任何大小的C:驱动器上的最大可用空间,但进行此更改将为硬盘上的页面文件保留该空间。

    不管怎样,我希望这能帮助人们理解为什么他们在一个应用程序中会遇到1.5-2GB的内存限制问题。NET应用程序,即使在64位Windows计算机上运行。这对人们来说可能是一个非常令人困惑的问题,我希望我的解释有意义。如果需要,请随时给我发消息,询问有关此答案的问题。

        5
  •  0
  •   SSpoke    5 年前

    将程序编译为 Any CPU 您将有无限量的内存可供使用,程序仍然可以使用x86(32位)DLL导入!!!

        6
  •  -1
  •   Jesper    11 年前

        7
  •  -2
  •   joe_coolish    14 年前

    static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        int i = 0;
        while (true)
        {
            using(byte newBt = new byte[1024 * 1024 * 10])
            {
                list.Add(newBt); // 10 MB
                i += 10;
                Console.WriteLine(i);
            }
        }
    }
    

    http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx

    推荐文章