Domanda

Il mio codice:

var list = new LinkedList<int>();
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
while (true)
{
    for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0);
    Console.WriteLine(ramCounter.NextValue());
}

Domande:

  1. La documentazione sembra dire che posso utilizzare un PerformanceCounter solo come Amministratore , ma ho corso la mia domanda come un utente standard e ha funzionato. Posso contare su questo?
  2. I costantemente ottenere OutOfMemoryException quando circa 200 MB di RAM rimangono, perché ? Non può essere dovuta alla frammentazione perché allocare un int alla volta. Inoltre, non può essere causa di problemi Indirizzabilità, come io sono già molto al di sopra 2GB (l'eccezione viene generata quando 2,8 su mia 3GB sono presi). L'uscita numeri dalla applicazione di test sono state verificate con una finestra Task Manager in esecuzione sul lato.
  3. Una volta ho avuto un BSOD quando l'applicazione è in esecuzione di test e circa 400 MB sono stati rimanenti. Eventuali suggerimenti su ciò che potrebbe eventualmente causare questo? Corro un assegno per l'integrità RAM, tutto il resto? Dovrei stare attenti con chiamando PerformanceCounter.NextValue() in un ciclo, o qualcosa del genere? Si noti, questa è la prima volta che ottengo un BSOD su questo PC.
  4. In alcuni punti l'esecuzione del programma, ottengo grandi ritardi. Per esempio. quando comincio a 1 GB di RAM libera, quando arrivo a 700 MB l'applicazione si blocca per 1 sec, quindi a circa 400 MB si blocca per circa 4 sec. Perchè è questo? Poiché il sistema operativo ha bisogno di scambiare cache del disco per liberare la memoria, o qualcosa del genere?

Nota: Perché sto facendo questo? Beh, io voglio che il mio intensivo della memoria app per rilevare quando 5 MB di RAM rimangono, e avverte l'utente con "La memoria è bassa, si prega di chiudere gli altri programmi e tornare, o questo programma fallirà".

È stato utile?

Soluzione

Non riesco a risolvere tutte le vostre domande, ma qui va

2) Sei su 32 o 64 bit di Windows? Sembra che si sta eseguendo un grande processo di conoscenza indirizzo con accesso a 3 GB (vale a dire il 32 bit di Windows). In ogni caso è necessario tenere a mente che la memoria è allocata in mandrini di varie dimensioni e il vostro utilizzo di heap non è l'unica fonte. Il CLR stessa ha numerose strutture, ogni filo ha una pila e così via. In ogni caso, non si può davvero aspettare di essere in grado di utilizzare esattamente 3 GB,

3) BSOD è a causa di errori del driver o del kernel. Per quanto ne so l'applicazione non può causare BSOD, quindi questo è molto probabilmente correlato.

4) Se si utilizza un sacco di memoria GC avrà un momento difficile tenere il passo. Come thread utente vengono sospese mentre alcune parti del GC è in corso questo rallenterà l'applicazione in modo significativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top