2009-03-18 32 views

Respuesta

11

This thread parece exactamente lo que quieres.

Si leo la publicación del MVP correctamente, en un sistema de 32 bits, está limitado a un tamaño de almacenamiento dinámico de 1,5 GB sin importar qué, de lo que obtendrá todo tan pronto como comience el proceso. En un sistema de 64 bits, su montón es esencialmente ilimitado, no creo que ningún servidor convencional o PC pueda almacenar tanta memoria física como un proceso de 64 bits pueda resolver.

+1

¿Qué sucede si quiere limitar el tamaño del montón a una cantidad establecida? –

+0

¡Asegúrese de construir su ensamble a x64 o cualquier CPU! Si compila x86, incluso en un OS/Hardware x64, tendrá el límite de 1,5 GB. – Despertar

+0

Creo que OP está preguntando cómo limitar el montón de una aplicación .Net para usar solo 256MB. Él pregunta si hay una variable de argumento/configuración/entorno que hará eso, no necesariamente solo aumentando el montón. –

5

Por lo que he encontrado, no hay una manera simple de controlar el tamaño del montón de una aplicación .Net usando el CLR.

El enlace en la respuesta @ Dave solo responde la mitad de la pregunta. Cuando investigué este mismo problema, la respuesta es "El montón crece para usar toda la memoria disponible" como si esa fuera la única razón por la que deseara controlar el tamaño máximo de almacenamiento dinámico.

En entornos de servidor (normalmente Java), no desea que una aplicación de mal comportamiento acapare la memoria a expensas de otras aplicaciones alojadas. Una solución simple es limitar la cantidad de memoria que la aplicación puede usar para su montón. Esto se logra con el argumento -Xmx de Java para que pueda garantizar que la aplicación no usará más de lo que está planificado, p. Ej. -Xmx256M. Dado que asignar memoria en el montón durante la inicialización puede ralentizar el inicio de las aplicaciones, Java usa el argumento -Xms para permitir que las aplicaciones que hacen mucha creación de objetos durante la inicialización comiencen con un gran bloque de almacenamiento dinámico en lugar de que la JVM cambie el tamaño del montón va.

.Net's CLR no tiene esta capacidad. Sospecho que es porque .Net's CLR no es una máquina virtual. El CLR pasa a ser una API (bastante completa, podría agregar) que sirve como un adaptador para .dlls nativos que equivale a un enfoque mucho más parecido a un ejecutable cuando se trata de la administración de la memoria.

He hecho esta pregunta sobre el desarrollo de SharePoint y oí que es posible controlar el amperaje mediante el uso de módulos IIS llamados Aplicaciones Web por lo que puede decirle a IIS que limite la memoria de una aplicación web determinada. Me pregunto si esto se debe a que IIS tiene rutinas personalizadas que reemplazan/anulan new()/malloc()/etc y así pueden proporcionar este tipo de control a las aplicaciones cliente. Eso significa que las aplicaciones independientes de .Net no están de suerte a menos que desee escribir un administrador de memoria personalizado en C++ y crear una interfaz para .NET

La conclusión es que un programa CLR utiliza las políticas de gestión de memoria/controla el alojamiento proceso pone en marcha. Es por eso que tiene que controlar el uso de memoria de una página web de C# desde IIS, porque IIS es en realidad un proceso de host que proporciona el entorno para que se ejecute el código CLR.

Cuestiones relacionadas