.net memory clr4.0

.net - ¿Objetos únicos aún están limitados a 2 GB de tamaño en CLR 4.0?



memory clr4.0 (3)

.NET Framework 4.5 permite crear matrices de más de 2 GB en plataformas de 64 bits. Esta característica no está activada por defecto, tiene que estar habilitada a través del archivo config usando el elemento gcAllowVeryLargeObjects.

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

Según tengo entendido, hay un límite de 2 GB para instancias individuales en .NET. No le he prestado mucha atención, ya que he trabajado principalmente en sistemas operativos de 32 bits hasta ahora. En 32 pero es más o menos una limitación artificial de todos modos. Sin embargo, me sorprendió bastante saber que esta limitación también se aplica a .NET de 64 bits .

Como las colecciones como List<T> usan una matriz para almacenar elementos, eso significa que una aplicación .NET que se ejecuta en 32 bits podrá contener el doble de elementos de tipo de referencia en una lista en comparación con la misma aplicación que se ejecuta en 64 bits. Eso es bastante sorprendente, imo.

¿Alguien sabe si esta limitación se aborda en CLR 4.0 (no tengo una instalación 4.0 disponible en este momento).


Es peor que eso, tu espacio de proceso, cuando trabajas en .NET en 32 bits es mucho más pequeño que el límite teórico. En las aplicaciones .NET de 32 bits, mi experiencia es que siempre tenderá a tener errores de memoria en algún lugar alrededor de 1.2-1.4gb de memoria (algunas personas dicen que pueden llegar a 1.6 ... pero nunca lo he visto ) Por supuesto, esto no es un problema en los sistemas de 64 bits.

Dicho esto, una única serie de 2 GB de tipos de referencia, incluso en sistemas de 64 bits, es una gran cantidad de objetos. Incluso con referencias de 8 bytes, tiene la capacidad de asignar una matriz de 268,435,456 referencias de objetos, cada una de las cuales puede ser muy grande (hasta 2 GB, más si utilizan objetos anidados). Eso es más memoria de la que la mayoría de las aplicaciones necesitarían realmente.

Uno de los miembros del equipo de CLR escribió un blog sobre esto , con algunas opciones para solucionar estas limitaciones. En un sistema de 64 bits, hacer algo como su BigArray <T> sería una solución viable para asignar cualquier cantidad de objetos en una matriz, mucho más que el límite de 2gb para un solo objeto. P / Invoke puede permitirle asignar matrices más grandes también.

Editar: Debería haber mencionado esto, también - No creo que este comportamiento haya cambiado para .NET 4. El comportamiento no ha cambiado desde el comienzo de .NET.

Editar: .NET 4.5 ahora tendrá la opción en x64 para permitir explícitamente que los objetos sean más grandes que 2gb configurando gcAllowVeryLargeObjects en el app.config.


Esto es un gran problema en el campo numérico. Cualquiera que use bibliotecas de clases numéricas en .NET tiene sus matrices almacenadas como matrices debajo. Esto es para que se puedan llamar las bibliotecas nativas para hacer el cálculo numérico. El límite de 2 GB dificulta seriamente el tamaño de las matrices posibles en .NET de 64 bits. Más here .