2009-06-11 14 views
9

He leído (http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx) que el tamaño máximo de un objeto en .NET es de 2 GB..NET Max Memory Use 2GB incluso para x64 Ensambles

Estoy en lo correcto al asumir que si tengo un objeto que ocupa 256 MB de memoria, ya que es un tipo de referencia, puedo tener una matriz de estos objetos de 256 MB donde todos los objetos juntos pueden tomar> 2GB de memoria como ¿Cuánto tiempo el tamaño de la matriz de referencia se mantiene por debajo de 2 GB?

+0

pregunta interesante. No sabía que habría este límite en una máquina de 64 bits. Dicho esto, no puedo pensar en muchos escenarios para una aplicación que contiene 2 GB en un solo objeto. – RichardOD

+0

Estoy de acuerdo, no hay muchos escenarios en los que necesitaría más de 2 GB en un solo objeto. Un servidor de juego o servidor de base de datos es realmente lo único que viene a la mente. – Nate

Respuesta

10

Sí, su suposición es correcta.

El límite de 2 GB se aplica a cada objeto individualmente. La memoria total utilizada para todos los objetos puede exceder los 2 GB.

(Si el tiempo de ejecución puede asignar memoria suficiente para sus requisitos es otro asunto. Dudo si podría encontrar una memoria extra de 2 GB en una máquina de 32 bits, pero no debería ser un problema en 64 bits).

+0

Entonces, ¿la "matriz de referencia" será un objeto que (típicamente) ocuparía la misma cantidad de espacio que una "matriz de enteros"? – Nate

+1

Nate> es un detalle de implementación pero las referencias son punteros actualmente y tienen el mismo tamaño que el tamaño del puntero (en C era el mismo que en sizeof (int) en la mayoría de los sistemas, pero en C# int siempre significa Int32) –

+0

es extraño teniendo en cuenta que la clase Array de .NET tiene métodos especiales que toman argumentos de longitud de matriz "larga". Si el límite es de 2 GB, es imposible que una longitud de matriz se desborde de una int de 32 bits. – Qwertie

6

"En .NET 4 y anteriores, ningún objeto podría tener más de 2 GB de tamaño, incluso en procesos de 64 bits. Sin embargo, para ciertas cargas de trabajo que usan matrices grandes, este límite de tamaño puede ser restrictivo. NET 4.5 admite aumentar el límite de matrices en procesos de 64 bits, de modo que las matrices pueden ser mayores de 2 GB. Esto significa, por ejemplo, que puede asignar una matriz de Int32.MaxValue Int32s, aunque dicha matriz consumirá 8 GB. Los objetos grandes en .NET se asignan en un montón especial, conocido no coincidentemente como el Gran montón de objetos (LOH); .NET 4.5 también ha visto mejoras significativas en el rendimiento del LOH, incluido el uso de mejores algoritmos para administrar la memoria libre en el montón ".

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