2008-10-10 10 views
38

¿Hay alguna manera de establecer un límite de memoria de todo el sistema que un proceso puede usar en Windows XP? Tengo un par de aplicaciones inestables que funcionan bien la mayor parte del tiempo pero que pueden afectar a un error que resulta en consumir toda la memoria en cuestión de segundos (o al menos supongo que así es). Esto da como resultado un restablecimiento completo ya que Windows deja de responder por completo y pierdo mi trabajo.Establecer el límite de memoria del proceso de Windows (o usuario)

Me gustaría poder hacer algo como/etc/limits en Linux - configurar M90, por ejemplo (para establecer el 90% de memoria máxima para un solo usuario para asignar). Entonces el sistema obtiene el 10% restante sin importar nada.

+0

BartPE hace algo así, por lo que debería ser posible. No tengo idea de cómo. – OregonGhost

+2

@ Michał Minicki, ¿Podría explicarnos cómo le ha ayudado la respuesta seleccionada? Afaict, describe cómo superar el problema usando WINAPI, pero no se proporciona ninguna aplicación que suspenda genéricamente, enganche y envuelva procesos existentes en 'CreateJobObject's. ¿Qué me estoy perdiendo? –

+0

@OregonGhost, ¿tienes más información sobre esa habilidad? –

Respuesta

28

Usar Windows Job Objects. Los trabajos son como grupos de procesos y pueden limitar el uso de la memoria y la prioridad del proceso.

4

Dependiendo de sus aplicaciones, puede ser más fácil limitar la memoria que utiliza el intérprete de idiomas. Por ejemplo, con Java puede establecer la cantidad de RAM que se asignará a la JVM.

De lo contrario, es posible configurarlo una vez para cada proceso con la API de Windows

SetProcessWorkingSetSize Function

+8

Esto no limita la cantidad de memoria que un proceso puede comprometer solo la cantidad que se busca en cualquier momento específico. Puede funcionar la mayor parte del tiempo para el póster original, pero la respuesta correcta para limitar la cantidad de memoria total que un proceso puede usar es usar un objeto de trabajo. –

3

No hay manera de hacer esto que yo sepa, aunque tengo mucha curiosidad por leer si alguien tiene una buena respuesta. He estado pensando en agregar algo como esto a una de las aplicaciones que construye mi empresa, pero no he encontrado una buena manera de hacerlo.

Lo único que puedo pensar (aunque no directamente en el punto) es que creo que puede limitar el uso total de memoria para una aplicación COM + en Windows. Sería necesario que la aplicación se escriba para ejecutarse en COM +, por supuesto, pero es la forma más cercana que conozco.

El conjunto de trabajo es bueno (Objetos de trabajo también controla los conjuntos de trabajo), pero no es el uso total de memoria, solo el uso real de memoria (paginado) en cualquier momento. Puede funcionar para lo que quieras, pero afaik no limita la memoria total asignada.

+1

JobObjects también puede controlar la cantidad máxima de memoria virtual que un trabajo o proceso puede comprometer. Consulte SetInformationJobObject y la estructura JOBOBJECT_EXTENDED_LIMIT_INFORMATION. –

19

Utilice la herramienta Application Verifier (AppVerifier) de Microsoft.

En mi caso necesito para simular memoria ya no está disponible así que hice lo siguiente en la herramienta:

  1. Añadido mi solicitud
  2. sin control básico
  3. cuadros de simulación de recursos bajo
    • Hora cambiada a 120000: mi aplicación se ejecutará normalmente durante 2 minutos antes de que todo entre en vigencia.
    • HeapAlloc cambiar a 100 - 100% de probabilidad de error de asignación del montón
    • Set Pilas a cierto - la pila no será capaz de crecer más
  4. Guardar
  5. Iniciar mi solicitud

Después de 2 minutos, mi programa ya no podía asignar memoria nueva y pude ver cómo se manejaba todo.

Cuestiones relacionadas