在我的笔记本电脑上,运行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? 更多细节。