2009-04-04 15 views
13

¿Cuál es la cantidad máxima de memoria que se puede lograr en el código administrado de .NET? ¿Depende de la arquitectura real (32/64 bits)?¿Máxima memoria alcanzable .NET?

+0

sí hay .. Darle un tiro y ver el Tiempo de ejecución estallar a alrededor de 900 MB en arquitecturas de 32 bits. O simplemente ejecute un conjunto de datos decente, ni siquiera grande. Triste realmente. –

+0

Más hechos serían agradables. –

+0

Bueno, si necesita un hecho, es mejor que lo cargue y esté atento a la excepción de OutOfMemory cuando llegue. El problema es que solo tiene que ejecutar un par de tales aplicaciones (ya sabe el tamaño decente) y voila: CLR es que los teóricos eficientes se vuelven locos al respecto. –

Respuesta

2

Sí, en un entorno de 32 bits está limitado a un espacio de direcciones de 4 GB pero Windows reclama aproximadamente la mitad. En una arquitectura de 64 bits es, bueno, mucho más grande. Creo que es 4G 4G *

y sobre el marco compacto que por lo general está en el orden de unos pocos cientos de MB

+2

Decir 4G * 4G engañará a las personas para que piensen en 16G. Realmente, 4G tiene 2^32 bytes, por lo que casi 4 mil millones. y el límite de 64 bits es 2^64 = (2^32) * (2^32), que es (4 mil millones) * (4 mil millones) y eso es mucho más que 16G. – Karl

11

no hay duro, cifra exacta de código .NET.

Si ejecuta Windows de 32 bits; su proceso depuede direccionar hasta 2 GB, 3 GB si el modificador/3GB se utiliza en Windows Server 2003.

Si ejecuta un proceso de 64 bits en un cuadro de 64 bits su proceso depuede direccionar hasta 8 TB del espacio de direcciones, si esa cantidad de RAM está presente.

Sin embargo, esta no es toda la historia, ya que el CLR toma algunos gastos generales para cada proceso. Al mismo tiempo, .NET intentará asignar nueva memoria en fragmentos; y si el espacio de direcciones está fragmentado, eso podría significar que no puede asignar más memoria, aunque algunas estén disponibles.

+0

Eso no es verdad. Windows en x86 limita el tamaño de partición del modo de usuario a 8 TB (8192 GB). –

+1

"puede abordar todo el espacio de direcciones de 64 bits, si esa cantidad de RAM está presente", no es correcto y debería editarse. –

+1

Proceso de 32 bits en 64 bits Windows puede acceder a 4 GB de espacio de usuario (con gran capacidad de dirección ... el mismo criterio que para acceder a 3 GB en el conmutador/3 GB). – Richard

7

En C# 2.0 y 3.0 también hay un límite de 2G en el tamaño de un solo objeto en el código administrado.

0

Creo que otras respuestas son bastante ingenuas, en el mundo real después de 2GB de consumo de memoria su aplicación se comportará muy mal. En mi experiencia, las GUI en general se vuelven masivamente torpes, inutilizables después de muchos consumos de memoria.

Esta fue mi experiencia, obviamente la causa real de esto puede ser que los objetos crezcan demasiado, por lo que todas las operaciones en esos objetos toman demasiado tiempo.

5

Para Windows de 64 bits, el tamaño de la memoria virtual es de 16 TB dividido equitativamente entre el usuario y el modo kernel, por lo que los procesos del usuario pueden abordar 8 TB (8192 GB). Eso es menos que todo el espacio 16 EB direccionable por 64 bits, pero todavía es mucho más de lo que estamos acostumbrados con 32 bits.

3

.NET runtime puede asignar toda la memoria libre disponible para los programas de modo de usuario en su host. Tenga en cuenta que no significa que toda esa memoria estará dedicada a su programa, ya que algunas porciones (relativamente pequeñas) estarán dedicadas a las estructuras internas de datos de CLR. En sistemas de 32 bits, suponiendo una configuración de 4 GB o más (incluso si PAE está habilitado), debería poder obtener aproximadamente 2 GB asignados a su aplicación. En los sistemas de 64 bits, debería poder obtener 1TB. Para obtener más información sobre los límites de memoria de Windows, consulte this page. Cada figura mencionada debe dividirse por 2, ya que Windows reserva la mitad superior del espacio de direcciones para el uso del código que se ejecuta en modo núcleo (anillo 0). Además, tenga en cuenta que para un sistema de 32 bits el límite excede de 4 GB, el uso de PAE es implícito y, por lo tanto, no puede exceder el límite de 2 GB a menos que el sistema operativo soporte 4gt, en cuyo caso puede alcanzar hasta 3 GB .

7

La cantidad de memoria que puede procesar su proceso .NET depende de si se está ejecutando en una máquina de 32/64 bits y si se está ejecutando o no como un proceso independiente de CPU o CPU.

De manera predeterminada, un proceso .NET es independiente de la CPU por lo que se ejecutará con el tipo de proceso que es natural para la versión de Windows. En 64 bits será un proceso de 64 bits, y en 32 bits será un proceso de 32 bits.Puede obligar a un proceso .NET a apuntar a una CPU en particular y decir que se ejecute como un proceso de 32 bits en una máquina de 64 bits.

Si se excluye la gran dirección de ajuste de cuenta, las siguientes son las diferentes averías proceso poco

  • 32 puede abordar 2GB
  • proceso poco
  • 64 puede abordar 8 TB

Aquí hay un enlace al desglose completo del espacio direccionable en función de las diversas opciones que proporciona Windows.

http://msdn.microsoft.com/en-us/library/aa366778.aspx

0

La siguiente entrada del blog ha detallado hallazgos sobre x86 y x64 de memoria máx. También tiene una pequeña herramienta (fuente disponible) que permite una fácil utilización de las diferentes opciones de memoria: http://www.guylangston.net/blog/Article/MaxMemory.

5

Recientemente he estado haciendo un amplio perfil sobre los límites de memoria en .NET en un proceso de 32 bits. Todos nos sentimos bombardeados por la idea de que podemos asignar hasta 2,4 GB (2^31) en una aplicación .NET pero desafortunadamente esto no es cierto :(. El proceso de solicitud tiene mucho espacio para usar y el sistema operativo funciona muy bien. Sin embargo, el propio .NET parece tener su propia sobrecarga, que representa aproximadamente 600-800 MB para aplicaciones típicas del mundo real que superan el límite de memoria. Esto significa que tan pronto como se asigna una matriz de enteros que toma aproximadamente 1,4 GB, debería esperar ver una OutOfMemoryException().

Obviamente en 64 bits, este límite se produce mucho más tarde (chateemos en 5 años :)), pero el tamaño general de todo en la memoria también crece (estoy descubriendo es ~ 1.7 a ~ 2 veces) debido al aumento del tamaño de la palabra.

Lo que sí estoy seguro es que la idea de memoria virtual del sistema operativo definitivamente NO le proporciona un espacio de asignación prácticamente infinito dentro de un proceso. Está solo allí, por lo que los 2.4 GB completos son direccionables para todas las (muchas) aplicaciones que se ejecutan a la vez.

Espero que esta información ayude un poco.

Originalmente respondí algo relacionado aquí (todavía soy un Newby así que no estoy seguro de cómo se supone que tengo que hacer estos enlaces):

Is there a memory limit for a single .NET process

+0

¿Por qué querías publicar esta misma respuesta varias veces? –

+0

Lo siento, soy un novato. ¿Cómo vincula las preguntas y respuestas relacionadas en este sitio? –