C#应用程序可以使用多少RAM?

时间:2013-04-25 12:35:59

标签: c# memory

我的应用程序包含非常大的DataTable对象,非常大的数组等。

目前我的内存使用率低于2GB。

当我的应用程序在32位系统上生成4个1GB大小的阵列时会发生什么?

它会崩溃吗?

我知道CLR中的2GB对象大小限制,但是许多大对象呢?

我试图测试它,我声明了几个大数组,但是当它们是空的时,他们似乎没有使用RAM。我没试过填写它们,我决定在这里问。

5 个答案:

答案 0 :(得分:6)

64位应用程序(包括托管应用程序)可以访问大容量内存。

32位应用程序的虚拟地址空间最大为4GB。实际上,它们默认为2GB。 /LARGEADRESSAWARE应用程序可以在boot.ini中获得3GB / 3gb或在WoW64上运行时获得4GB。

托管应用程序,即使在x64上也不能,分配任何大于2GB的单个对象。这包括数组。

但无论您可以使用的VA数量多少:操纵+ 2GB DataTable对象都无法正常工作。使用能够快速处理和操作大量数据并能够智能分页的存储引擎。 RedisCassandra甚至传统的RDBMS更适合这项工作。

即使如果决定直接在内存中操作数据,您也需要比DataTable更智能的格式。

答案 1 :(得分:3)

所有32位应用程序仅限于2GB of memory *。所以无论你如何分配RAM,你都会以2GB的速度运行。

如果您需要更多,则需要在64位系统上运行它并将其编译为64位。

  • 使用LARGEADDRESSAWARE 32位应用程序最多可以使用3GB内存,感谢Marc Gravell在评论中提醒我这一点。

答案 2 :(得分:1)

如果使用的RAM超出了可以解决的(或有),则会出现System.OutOfMemoryException异常。 试试这段代码看看:

        List<byte[]> foo = new List<byte[]>();
        for (int i = 0; i < 10000; ++i )
            foo.Add(new byte[1024*1024*1024]);

答案 3 :(得分:1)

是的,它会崩溃。这是我尝试过的示例代码:

class Program
{
    static byte[] arr = new byte[1024 * 1024 * 1024];
    static byte[] arr2 = new byte[1024 * 1024 * 1024];
    static byte[] arr3 = new byte[1024 * 1024 * 1024];
    static byte[] arr4 = new byte[1024 * 1024 * 1024];
    static void Main(string[] args)
    {            
        Console.ReadKey();
    }
}

这是一个相当原始的测试程序。除非可以立即强烈访问全部数据,否则它可能已经被GC部分回收,因此不会崩溃。

您还可以将它们设为本地。但是,如果您进行发布构建(使用代码优化),则以下位的工作方式类似于魅力,因为未使用的数组(或通常是变量)可能会被优化掉:

static void Main(string[] args)
{
    byte[] arr = new byte[1024 * 1024 * 1024];
    byte[] arr2 = new byte[1024 * 1024 * 1024];
    byte[] arr3 = new byte[1024 * 1024 * 1024];
    byte[] arr4 = new byte[1024 * 1024 * 1024];
    Console.ReadKey();
}

Debug Build (无代码优化)中,上面的位也崩溃了OutOfMemoryException

相反的领域当然不能随便离开。因此,无论代码是否由编译器优化,第一个示例都会崩溃。

答案 4 :(得分:0)

有关不同操作系统的物理内存限制,请参阅本文Memory Limits for Windows Releases

但是,可以将运行为32位的.NET应用程序的限制从2GB增加到3GB。为此,您必须在可执行文件上运行editbin /LARGEADDRESSAWARE。您可以在此处找到有关它的更多详细信息: