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

时间:2011-05-24 07:53:55

标签: c# .net windows memory-management 64-bit

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

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

如果我的手上没有配备更多内存的计算机,我想知道这是否会扩展,以便在具有4 Gb可用内存的计算机上,我将能够分配60M项而不是“仅”30M等等上?

或者在我能够消耗所有可用内存之前还有其他限制(.Net和/或Windows)吗?

更新:好的,所以我不允许分配大于2 Gb的单个对象。知道这一点很重要!但是我当然很想知道我是否能够通过像这样分配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 ) );

如果计算机具有&gt; 20Gb可用内存,这会起作用吗?

2 个答案:

答案 0 :(得分:17)

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

这些限制虽然受到堆碎片的影响,即使GC确实试图压缩堆,但是大对象(有时是80K左右的任意交叉)最终会出现在大对象堆上,这是一堆堆。压缩了。严格来说,如果你可以将短期分配维持在这个阈值以下,那么你的整体GC内存管理和性能会更好。

答案 1 :(得分:9)

更新:随着.NET 4.5的发布,2Gb单对象内存限制在64位上被提升。

您需要在app.config中设置gcAllowVeryLargeObjects

但是,数组中的最大元素数仍然是2 ^ 32-1。

有关详细信息,请参阅Single objects still limited to 2 GB in size in CLR 4.0?