64位.Net应用程序中的内存限制?

在我的笔记本电脑上,运行64位Windows 7和2 GB可用内存(由任务pipe理器报告),我能够做到:

var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 ); 

没有更多的RAM在我手中的计算机,我想知道这是否会扩大,以便在具有4 GB可用内存的计算机上,我将能够分配60M项目而不是“只是”30M等等?

还是有其他的限制(.Net和/或Windows),我会碰到之前,我能够消耗所有可用的RAM?

更新:好的,所以我不能分配一个大于2GB的单个对象。 知道这一点很重要! 但是,我当然好奇地想知道,如果能够像这样分配2 Gb的块,我能够充分利用所有的内存:

  var x = new List<Dictionary<Guid, decimal>>(); for ( var i = 0 ; i < 10 ; i++ ) x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) ); 

如果电脑具有> 20Gb的可用内存,这是否工作?

.NET中的所有对象都有2个GiB的限制,您绝不允许创建超过2个GiB的单个对象。 如果你需要一个更大的对象,你需要确保对象是由小于2 GiB的部分构建的,所以你不能有一个大于2 GiB的连续比特的数组或者比512 MiB更长的单个字符串,我不是完全肯定字符串,但是我已经对这个问题做了一些测试,当我试图分配大于512MB的字符串时,我得到了OutOfMemoryExceptions。

尽管这些限制会受到堆碎片的影响,并且即使GC确实试图压缩堆,大型对象(在80K左右有些任意交叉)最终会出现在大型对象堆上,这是一堆没有压缩的堆。 严格地说,还有一点值得注意的是,如果您可以保持低于此阈值的短期分配,那么对于您的整体GC内存管理和性能来说将会更好。

更新:随着.NET 4.5的发布,2Gb单对象内存限制已经取消了64位。

您需要在app.config中设置gcAllowVeryLargeObjects

尽管如此,数组中元素的最大数量仍然是2 ^ 32-1。

在CLR 4.0中查看单个对象的大小仍然限制在2 GB? 更多细节。