Definir o limite de memory do processo do Windows (ou usuário)

Existe alguma maneira de definir um limite de memory do sistema que um processo pode usar no Windows XP? Eu tenho um par de aplicativos instáveis ​​que funcionam ok para a maioria do tempo, mas pode acertar um bug que resulta em comer toda a memory em questão de segundos (ou pelo menos eu suponho que é isso). Isso resulta em uma redefinição de hardware como o Windows se torna totalmente sem resposta e eu perco meu trabalho.

Eu gostaria de poder fazer algo como o / etc / limits no Linux – definindo o M90, por exemplo (para definir 90% de memory máxima para um único usuário alocar). Então o sistema recebe os 10% restantes, não importa o que aconteça.

Use os objects de trabalho do Windows. Os trabalhos são como grupos de processos e podem limitar o uso da memory e a prioridade do processo.

Use a ferramenta Application Verifier (AppVerifier) da Microsoft.

No meu caso, eu preciso simular a memory não estar mais disponível, então fiz o seguinte na ferramenta:

  1. Adicionado meu aplicativo
  2. Básico não verificado
  3. Verificação de baixa simulação de resources
    • TimeOut alterado para 120000 – meu aplicativo será executado normalmente por 2 minutos antes que qualquer coisa entre em vigor.
    • HeapAlloc alterado para 100 – 100% de chance de erro de alocação de heap
    • Defina Stacks como true – a pilha não conseguirá crescer mais
  4. Salve 
  5. Inicie minha inscrição

Após 2 minutos, meu programa não pôde mais alocar memory nova e pude ver como tudo era tratado.

Dependendo de seus aplicativos, pode ser mais fácil limitar a memory que o interpretador de idiomas usa. Por exemplo, com Java você pode definir a quantidade de RAM que a JVM será alocada.

Caso contrário, é possível configurá-lo uma vez para cada processo com a API do Windows

Função SetProcessWorkingSetSize

Não há como fazer isso que conheço, embora esteja muito curioso para saber se alguém tem uma boa resposta. Eu estive pensando em adicionar algo assim a um dos aplicativos que minha empresa constrói, mas não encontrei uma boa maneira de fazê-lo.

A única coisa que posso pensar (embora não diretamente no ponto) é que eu acredito que você pode limitar o uso total de memory para um aplicativo COM + no Windows. Isso exigiria que o aplicativo fosse escrito para ser executado no COM +, é claro, mas é a maneira mais próxima que eu sei.

O material do conjunto de trabalho é bom (objects de trabalho também controlam conjuntos de trabalho), mas isso não é uso de memory total, apenas o uso de memory real (paginado em) a qualquer momento. Pode funcionar para o que você quer, mas não afeta o total de memory alocada.