27 votos

Puede asignar memoria máxima un proceso. net

¿Cuál es el máximo de memoria que el recolector de basura puede asignar a una .NETA proceso? Cuando puedo compilar para x64, Proceso de.GetCurrentProcess.MaxWorkingSet devuelve acerca de 1,4 GB, pero cuando voy a compilar para AnyCPU (x64) el mismo número se devuelve. Para x64 debería ser más como el "Límite" valor que se muestra en el Administrador de Tareas. ¿Cómo puedo obtener el número correcto que hará que OutOfMemory-Excepciones cuando se supera en todos los casos?

Algunos ejemplos de lo que el método debe devolver:

1) la Configuración de la Máquina: x64 de Windows, 4GB de memoria física, 4GB de archivo de página
-Como proceso de 64 Bits: 8 GB
-Como proceso de 32 Bits: 1.4 GB

2) la Configuración de la Máquina: x64 de Windows, 1 gb de memoria física, 2 GB de archivo de página
-Como proceso de 64 Bits: 3 GB
-Como proceso de 32 Bits: 1.4 GB

3) la Configuración de la Máquina: x32-Windows, 4GB de memoria física, 4GB de archivo de página
-Como proceso de 64 Bits: no va a suceder
-Como proceso de 32 Bits: 1.4 GB

4) Configuración de la Máquina: x32-Windows, 512 mb de memoria física, 512 mb de archivo de página
-Como proceso de 64 Bits: no va a suceder
-Como proceso de 32 Bits: 1.0 GB

17voto

ShuggyCoUk Puntos 24204

Windows puede ser configurado para asignar más espacio de archivo en la demanda o en la solicitud.
Objetos de trabajo puede prevenir el consumo de más de una cierta cantidad de memoria.
La fragmentación de la pila y el relevo generacional de la naturaleza de la misma (además de la necesidad de invertir una gran cantidad de cosas en el Montón de Objetos Grandes)

Todos estos significa que el límite no es de mucho uso en la realidad y significa responder a la pregunta "¿cuánta memoria podría teóricamente asignar" es bastante más complejo de lo que crees.

Ya es complejo de alguien pidiendo que la cuestión es, probablemente, tratando de hacer algo mal y debería redirigir a su pregunta para algo más útil.

¿Qué estás tratando de hacer que parece requerir tal pregunta?

"Sólo quiero saber cuando la corriente de carga de memoria del proceso podría obtener problemática así que puede tomar acciones como liberar a algunos de los elementos de una caché personalizado."

A la derecha. esto es mucho más manejable una pregunta.

Dos soluciones en orden de complejidad:

  1. Hacer sus cachés uso de WeakReferences
    • Esto significa que las cosas van a ser liberado por el sistema casi por arte de magia, sí, pero usted tiene poco control sobre cosas como la política de sustitución de
    • esto se basa en los datos de la memoria caché es mucho más grande que la clave y la sobrecarga de una referencia débil
  2. Registro de notificación de la recolección de Basura
    • Esto le permite tomar el control de liberar a las cosas.
    • usted confía en el sistema de tener el adecuado tamaño máximo para el GC generaciones que puede tomar un tiempo para llegar a un estado estacionario.

Puntos a tener en cuenta. Es realmente menos costoso mantener esta enorme caché (ir a la disco por los sonidos de la misma) que recalcular/volver a pedir los datos.
Si la caché no se exhibe pobres de la localidad entre los comúnmente/consecutivamente elementos solicitados luego de mucho esfuerzo se pasó de paginación de datos. Un caché más pequeña, con una efectiva atentos relpacement política tiene buenas posibilidades de realizar considerablemente mejor (y con mucho menos impacto en otros programas en ejecución)

Como un aparte: En .Neta, no hay ninguna variable de tamaño de objeto (cadenas, matrices) pueden ser de más de 2 gb de tamaño debido a las limitaciones del núcleo CLR estructuras para la gestión de la memoria. (y cualquiera de las soluciones anteriores, se beneficiarán de esta)

3voto

Nic Wise Puntos 4722

No se depende de cuanta RAM tienes?

En teoría, un x64 proceso puede asignar EB (etabytes?) de RAM, creo - es decir, MUCHO. Pero si lo hace, la máquina de paginación como un loco y generalmente mueren.

Fue diferente en modo de 32 bits, como no se podía asignar más de 1GB de RAM en CUALQUIER proceso en windows (sí, hay formas de hacerlo, pero no es bastante). En la práctica, esta ción de alrededor de 7-800meg por .NETA proceso, como .NET reservado algo de espacio.

De cualquier manera, en 32 bits, la mayoría de los que se puede usar es de 3GB - el sistema operativo se reserva 1GB de espacio virtual para sí mismo.

En la versión de 64 bits, debe ser de 2^64, que es un número grande, pero http://en.wikipedia.org/wiki/X86-64 dice que es 256TB de un espacio virtual, y 1 tb de RAM REAL. De cualquier manera, es mucho más de lo que usted se pueda tener en su máquina, por lo que va a golpear el archivo de página.

Con un sistema operativo de 64 bits y de 64 bits en tiempo de ejecución, .NET 2.0, las aplicaciones pueden utilizar 500 veces más memoria para datos tales como los basados en el servidor de caché.

Este tiene buena info, demasiado http://www.theserverside.net/tt/articles/showarticle.tss?id=NET2BMNov64Bit

Por CIERTO, si usted está en x 64 de la máquina (es decir, x64 máquina + x64 OS), la compilación para AnyCPU y x64 hace la misma cosa - que se ejecuta en x64 modo. La única diferencia es que si usted utiliza AnyCPU vrs x86:

  • x64 OS/.NET, AnyCpu: x64 app
  • x64 OS/.NET, x64: x64 app
  • x64 OS/.NET, x32: x32 aplicación (x64 .NET framework, ya que AMBOS x32 y x64 versiones de la Fx instalado)

  • x32 OS/NET, AnyCPU: x32 app

  • x32 OS/.NET, x64: CRASH and BURN BABY!!! (en realidad, sólo se muere correctamente)
  • x32 OS/.NET, x32: x32 aplicación.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X