2011-01-31 11 views
12

MSDN:Limitación de memoria de proceso con MaxWorkingSet

public IntPtr MaxWorkingSet { get; set; }

Obtiene o define la máxima permitida tamaño del conjunto de trabajo para el proceso de asociado. Valor de propiedad: El tamaño de conjunto de trabajo máximo permitido en la memoria para el proceso, en bytes.

Por lo tanto, por lo que yo entiendo, puedo limitar la cantidad de memoria que puede ser utilizada por un proceso. He intentado esto, pero sin suerte ..

Algunos código:

public class A 
{ 
    public void Do() 
    { 
     List<string> guids = new List<string>(); 
     do 
     { 
      guids.Add(Guid.NewGuid().ToString()); 
      Thread.Sleep(5); 
     } while (true); 
    } 
} 


public static class App 
{ 
    public static void Main() 
    { 
     Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(2097152); 
     try 
     { 
      new A().Do(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

Estoy esperando a excepción OutOfMemory después del límite de 2 MB se alcanza, pero no pasa nada .. Si abro el Administrador de tareas Puedo ver que la cantidad de memoria que usa mi aplicación está creciendo continuamente sin ningún límite.

¿Qué estoy haciendo mal? Gracias de antemano

Respuesta

10

No, esto no limita la cantidad de memoria utilizada por el proceso. Es simplemente un contenedor alrededor de SetProcessWorkingSetSize que a) es una recomendación, yb) limita el conjunto de trabajo del proceso, que es la cantidad de memoria física (RAM) que este proceso puede consumir.

Totalmente no causa una excepción de falta de memoria en ese proceso, incluso si asigna mucho más de lo que configura la propiedad MaxWorkingSet.

Existe una alternativa a lo que estás tratando de hacer: la API de objetos de trabajo de Win32. Hay un contenedor administrado para eso en Codeplex (http://jobobjectwrapper.codeplex.com/) al cual contribuí. Le permite crear un proceso y limitar la cantidad de memoria que este proceso puede usar.

+0

¡Muchas gracias! Algunas preguntas más en este caso :). ¿Qué puede causar un crecimiento significativo del uso del conjunto de trabajo? ¿Y qué sucederá cuando alcance el límite? ¿Será una excepción OutOfMemory o algo más? – Andrey

+0

Cuando el proceso asigna memoria, puede consumir el conjunto de trabajo (RAM). Sin embargo, si hay necesidad de RAM en otros procesos/componentes del sistema, entonces parte del conjunto de trabajo del proceso se puede paginar en el disco. Si usa Objetos de trabajo y se ejecuta en el límite, el proceso finaliza y puede recibir una notificación de que esto sucedió. –

+0

En realidad eso es incorrecto. Working Set es la cantidad de memoria usada recientemente que el proceso espera que necesite en el conjunto de trabajo, que afecta a L1/L2, no a la RAM. Depende del núcleo del sistema operativo cuándo desalojar de WS. El conjunto de trabajo es la memoria LRU que espera que se repita en el procesamiento, por ejemplo, un aspecto pequeño necesita poca WS, mientras que un ciclo grande requiere más. Establecer Working Set no afecta la cantidad de RAM que usará el proceso. –

Cuestiones relacionadas