.NET Max Memory即使对于x64程序集也使用2GB

Nat*_*ate 9 .net c# memory memory-management

我读过(http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx).NET中对象的最大大小是2 GB.

我是否正确假设如果我有一个占用256 MB内存的对象,因为它是一个引用类型,我可以拥有这些256 MB对象的数组,其中所有对象一起可能占用> 2GB内存,只要大小引用数组的值是否低于2 GB?

Luk*_*keH 10

是的,你的假设是正确的.

2GB限制适用于每个对象.用于所有对象的总内存可能超过2GB.

(运行时是否能够为您的需求分配足够的内存是另一回事.我怀疑它是否可以在32位机器上找到完整的2GB备用内存,但它在64位上应该不是问题.)

  • @Qwertie:如果我做了正确的数学运算,数组中的2GB Int32对象应该采用549,755,813,888个索引,这确实超出了Int32的范围.使它成为一个字节数组,并且它大4倍. (3认同)

art*_*ker 6

"在.NET 4及更早版本中,即使在64位进程中,任何对象的大小也不能超过2GB.但是,对于使用大型数组的某些工作负载,此大小限制可能会受到限制.因此,.NET 4.5支持提升64位进程中数组的限制,例如,数组可能大于2GB.这意味着,例如,你可以分配一个Int32.MaxValue Int32s数组,即使这样的数组将消耗8GB.大型对象在. NET被分配在一个特殊的堆上,并不是巧妙地称为大对象堆(LOH); .NET 4.5也看到了对LOH的显着性能改进,包括使用更好的算法来管理堆中的空闲内存.

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

http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx