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

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

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

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

会崩溃吗?

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

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

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

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

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

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

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

所有32位应用程序限制为2GB内存 *。 所以无论你如何分配RAM,你都会以2GB的速度运行。

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

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

如果使用的RAM多于可以解决的RAM(或者有),则会出现System.OutOfMemoryExceptionexception。 试试这段代码看:

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

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

 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崩溃。

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

有关不同操作系统的物理内存限制,请参阅本文内容限制Windows版本 。

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

  • 如何创建(32位).NET应用程序以使用3 GB RAM?
  • 增加内存限制