2008-10-10 10 views
38

C'è un modo per impostare un limite di memoria di sistema che un processo può utilizzare in Windows XP? Ho un paio di app instabili che funzionano bene per la maggior parte del tempo, ma possono colpire un bug che si traduce nel consumo di tutta la memoria in pochi secondi (o almeno suppongo che sia così). Ciò si traduce in un hard reset in quanto Windows diventa totalmente insensibile e io perdo il mio lavoro.Imposta limite di memoria processo (o utente) di Windows

Mi piacerebbe essere in grado di fare qualcosa come il/etc/limits su Linux - impostando M90, ad esempio (per impostare il 90% della memoria massima per un singolo utente da allocare). Quindi il sistema ottiene il restante 10%, non importa cosa.

+0

BartPE fa qualcosa del genere, quindi dovrebbe essere possibile. Non ho idea di come. – OregonGhost

+2

@ Michał Minicki, Potrebbe elaborare come la risposta selezionata ti ha aiutato? AFAICT, descrive come superare il problema utilizzando il WINAPI, ma nessuna applicazione è previsto che genericamente sospende, ganci e avvolge i processi esistenti in 'CreateJobObject's. Cosa mi manca? –

+0

@OregonGhost, hai ulteriori informazioni su questa abilità? –

risposta

28

Utilizzare Windows Job Objects. I lavori sono come gruppi di processi e possono limitare l'utilizzo della memoria e la priorità del processo.

4

A seconda delle applicazioni, potrebbe essere più semplice limitare la memoria utilizzata dall'interprete di lingua. Ad esempio con Java è possibile impostare la quantità di RAM assegnata alla JVM.

Altrimenti è possibile impostare una volta per ogni processo con il Windows API

SetProcessWorkingSetSize Function

+8

Questo in realtà non limitare la quantità di memoria di un processo può commettere solo l'importo che è paging in qualsiasi momento specifico. Si può lavorare il più delle volte per il manifesto originale, ma la risposta corretta a limitare la quantità di memoria totale di un processo può utilizzare è quello di utilizzare un oggetto processo. –

3

Non c'è modo di fare ciò che conosco, anche se sono molto curioso di leggere se qualcuno ha una buona risposta. Ho pensato di aggiungere qualcosa di simile a una delle app create dalla mia azienda, ma non ho trovato un buon modo per farlo.

L'unica cosa che posso pensare (anche se non direttamente sul punto) è che credo che si possa limitare l'utilizzo totale della memoria per un'applicazione COM + in Windows. Richiederebbe che l'app venga scritta per l'esecuzione in COM +, ovviamente, ma è il modo più vicino che conosca.

Il set di lavoro è buono (gli oggetti di lavoro controllano anche i working set), ma questo non è l'utilizzo totale della memoria, ma solo l'utilizzo della memoria reale (cercapersone) in qualsiasi momento. Può funzionare per quello che vuoi, ma a patto che non limiti la memoria allocata totale.

+1

JobObjects possono anche controllare la quantità massima di memoria virtuale che un lavoro o processo possono commettere. Controlla SetInformationJobObject e la struttura JOBOBJECT_EXTENDED_LIMIT_INFORMATION. –

19

Utilizzare lo strumento Application Verifier (AppVerifier) di Microsoft.

Nel mio caso ho bisogno di simulare la memoria non sia più disponibile così ho fatto la seguente nello strumento:

  1. aggiunto la mia applicazione
  2. incontrollato di base
  3. Controllato Simulazione Low Resource
    • Timeout modificato su 120000: la mia applicazione funzionerà normalmente per 2 minuti prima che tutto diventi effettivo.
    • Cambiato HeapAlloc al 100 - 100% di probabilità di errore di allocazione heap
    • Set Stack true - lo stack non sarà in grado di crescere di ingrandirsi
  4. Salva
  5. Inizia la mia domanda

Dopo 2 minuti il ​​mio programma non ha più potuto allocare nuova memoria e sono riuscito a vedere come tutto è stato gestito.

Problemi correlati