2009-09-17 10 views
6

correlati alla mia precedente interrogazione:
Preventing Memory issues when handling large amounts of textCome posso determinare la quantità di memoria il mio programma è attualmente occupa

C'è un modo per determinare la quantità di spazio di memoria il mio programma è occupante ? Finisco per elaborare una grande quantità di file di testo e di solito memorizzo gli oggetti elaborati. Ci sono dei momenti in cui ci saranno troppe informazioni e mi resterà a corto di memoria. Ho una soluzione per evitare il problema di allocazione della memoria, ma voglio solo usarla quando necessario, per evitare il paging, che alla fine ridurrà le mie prestazioni quando non è necessario. C'è un modo per capire quanta memoria sto occupando, in modo che io possa inserire le mie informazioni solo quando è necessario?

NOTA: Sto cercando una soluzione che il mio programma possa utilizzare per iniziare il paging quando necessario.

risposta

5

Si può provare GC.GetTotalMemory:

recupera il numero di byte attualmente pensato per essere assegnato. Un parametro indica se questo metodo può attendere un breve intervallo prima di tornare, per consentire al sistema di raccogliere i dati obsoleti e finalizzare gli oggetti .

La cosa importante da notare è questa parte: "Recupera il numero di byte attualmente pensato per essere assegnato". Ciò significa che questo metodo potrebbe non essere accurato al 100% - purché tu sappia che sta succedendo, dovresti essere in grado di avere un'idea approssimativa dell'utilizzo della memoria virtuale in un determinato punto dell'esecuzione dell'applicazione.

Edit: Fammi ora offrire una soluzione diversa che probabilmente sarà più produttivo: utilizzare perfmon e CLR performance counters.

+0

> "[...] migliore approssimazione disponibile del numero di byte attualmente allocati nella memoria gestita" Wont questo ottenere la quantità di memoria utilizzata da tutti gli assembly gestiti? –

+0

Sì, ma solo nell'AppDomain corrente. Consiglio vivamente di usare perfmon per questo genere di cose. –

3

È davvero necessario utilizzare un codice Profiler. Questi ti diranno esattamente cosa sta succedendo, dove la memoria è esaurita, ecc.

FYI: Raramente è dove pensi che sia.

+0

+1: anche se non soddisfa la tua domanda (dato che vuoi farlo in codice), questo è ancora vero; la creazione di profili dovrebbe essere ancora un passo del tuo progetto perché illuminerà aspetti dell'uso della memoria che potrebbero essere oscurati da misurazioni accessibili dal codice. Ad esempio, 'WorkingSet64' include la memoria condivisa, che potresti voler sottrarre dal totale quando decidi se andare a pagina o meno. –

7
long bytes = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
3

lunghi byte = System.Diagnostics.Process.GetCurrentProcess(). WorkingSet64 per più See Here

Problemi correlati