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

Dan*_*röm 20 .net c# windows 64-bit memory-management

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

var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );
Run Code Online (Sandbox Code Playgroud)

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

或者还有其他限制(.Net和/或Windows),在我能够消耗所有可用RAM之前我会遇到这些限制吗?

更新:好的,所以我不允许分配大于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 ) );
Run Code Online (Sandbox Code Playgroud)

如果计算机有超过20Gb的可用内存,这会工作吗?

Joh*_*ren 17

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

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


Eld*_*rum 9

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

您需要gcAllowVeryLargeObjects在app.config中进行设置.

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

请参阅CLR 4.0中仍限制为2 GB的单个对象?更多细节.