在CLR 4.0中,单个对象的大小仍然限制为2 GB?

Bri*_*sen 39 .net memory clr4.0

据我所知,.NET中的单个实例有2 GB的限制.我没有太多关注,因为到目前为止我主要使用32位操作系统.在32但它或多或少是一个人为的限制.但是,我很惊讶地发现这个限制也适用于64位.NET.

由于诸如List<T>使用数组来存储项目之类的集合,这意味着与在64位上运行的相同应用程序相比,在32位上运行的.NET应用程序将能够在列表中保存两倍的引用类型项.这非常令人惊讶.

有谁知道这个限制是否在CLR 4.0中得到解决(目前我手头没有安装4.0).

Ree*_*sey 53

它比那更糟 - 你是处理空间,当你在.NET中工作时,32位远小于理论极限.在32位.NET应用程序中,我的经验是你总是倾向于在大约1.2-1.4gb的内存使用量内开始出现内存错误(有些人说他们可以达到1.6 ......但我从未见过).当然,这在64位系统上不是问题.

话虽这么说,一个2GB的参考类型阵列,即使在64位系统上,也是一个庞大的对象.即使使用8字节引用,您也可以分配268,435,456个对象引用的数组 - 每个引用都可以非常大(最多2GB,如果它们使用嵌套对象则更多).这比大多数应用程序真正需要的内存更多.

CLR团队的一名成员在博客上发表了关于此问题的博客,并提供了一些解决这些限制的方法.在64位系统上,像BigArray <T>这样的东西将是一个可行的解决方案,可以将任意数量的对象分配到一个数组中 - 远远超过2gb的单个对象限制.P/Invoke也允许您分配更大的数组.


编辑:我也应该提到这一点 - 我不相信这种行为在.NET 4中完全没有改变.自.NET开始以来,这种行为一直没有改变.


编辑:.NET 4.5现在可以在x64中通过在app.config中设置gcAllowVeryLargeObjects来显式允许对象大于2gb.

  • 是的,Mono做到了.请注意,理论上的功能适用于所有CLR实现(所有数组都具有`long LongLength`属性),但到目前为止只有Mono实际使用它. (2认同)

小智 16

.NET Framework 4.5允许在64位平台上创建大于2GB的数组.默认情况下,此功能未启用,必须使用gcAllowVeryLargeObjects元素通过配置文件启用此功能.

http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx

  • @MarcGravell"数组中元素的最大数量是UInt32.MaxValue." (2认同)

Tre*_*ldt 13

这在数值领域是一个大问题.在.NET中使用数字类库的任何人都将其矩阵存储为下面的数组.这样就可以调用本机库来进行数字运算.2GB限制严重阻碍了64位.NET中可能的矩阵大小.更多这里.