2009-07-22 17 views
7

Ho una memoria di lunga durata di un programma sperimentale e mi piacerebbe sapere che è l'impronta di memoria effettiva. Il Task Manager dice (in windows7-64) che l'app consuma 800 mb di memoria, ma la quantità totale di memoria allocata, anche secondo il task manager, è 3.7 gb. La somma di tutta la memoria allocata non equivale a 3,7 GB. Come posso determinare, al volo, la quantità di memoria effettivamente consumata dalla mia applicazione.Quanta memoria viene effettivamente utilizzata dall'app Windows?

Corollario: quale memoria sta effettivamente segnalando il task manager? Non sembra essere tutta la memoria allocata all'app stessa.

risposta

2

Come ho capito, Task Manager mostra il working set;

working set: L'insieme di pagine di memoria recentemente toccati dai thread di un processo . Se la memoria disponibile nel computer supera una soglia, le pagine rimangono nel set di lavoro di un processo anche se non vengono utilizzate . Quando la memoria libera scende al di sotto della soglia , le pagine vengono troncate dal set di lavoro .

via http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx

È possibile ottenere Task Manager per mostrare la memoria virtuale pure.

Io di solito uso perfmon (Start -> Esegui ... -> perfmon) per tracciare l'utilizzo della memoria, utilizzando il contatore Byte privati. Riflette la memoria allocata dai normali allocatori (nuova/HeapAlloc/malloc, ecc.).

+0

@Kim: Quindi, non è un buon modo t o sapere quanta memoria è allocata ad una particolare applicazione, quindi, solo quanto è stato "recentemente" toccato, per un dato valore di "recentemente" – mmr

+0

Questa è l'idea, sì. –

+0

@Kim: Sembra che Perfmon sia ciò di cui ho bisogno, grazie! – mmr

0

Dipende da quale memoria si sta parlando. Sfortunatamente ci sono molti modi diversi per misurare la memoria. Per esempio ...

  • memoria fisica allocato
  • memoria virtuale Allocazione
  • memoria virtuale riservata (ma non impegnati)
  • Byte privati ​​
  • Bytes condivise

Quali metriche sono ti interessa?

Penso che molte persone tendano ad essere interessate alla categoria "Memoria virtuale allocata".

+0

È perché in genere non è possibile controllare quando la memoria viene scambiata su disco? Perché sembra che la memoria fisica allocata sia quella che causa i problemi.Non sono chiaro su questa relazione tra di noi ... – RedFilter

+0

@OrbMan, non sono sicuro della prima parte. Non conterei alcune API esistenti che dice "per favore non scambiare questa pagina di memoria" Ma non so di una mano libera – JaredPar

+0

@JaredPar: sono interessato a quanto dello spazio di indirizzamento a 64 bit è stato allocato, non necessariamente dove è stata quella memoria Come in, quanti e quanto sono grandi i miei array? Ho fatto qualche errore nel non rimuovere uno o due di quelli che pensavo di avere già? – mmr

2

La memoria è una cosa difficile da misurare. Un'applicazione potrebbe riservare un sacco di virtual memory ma in realtà non ne usa gran parte. Parte della memoria potrebbe essere condivisa; cioè, una DLL condivisa può essere caricata nello spazio di indirizzamento di diverse applicazioni, ma viene caricata una sola volta nella memoria fisica.

Una buona misura è la working set, che è l'insieme di pagine nel suo spazio di indirizzi virtuali a cui è stato effettuato l'accesso di recente. Qual è il significato di "accesso recente" dipende dal sistema operativo e dal suo page replacement algorithm. In altre parole, è l'insieme effettivo di pagine virtuali che sono mappate nella memoria fisica e sono in uso al momento. Questo è ciò che ti mostra il task manager.

L'utilizzo della memoria virtuale è la quantità di pagine virtuali che sono state prenotate (si noti che non tutte sono state effettivamente commesse, ovvero se è stato assegnato un backing store fisico per questo. Task Manager facendo clic su Visualizza -> Seleziona colonne

La cosa più importante però:. Se si vuole misurare in realtà la quantità di memoria programma sta utilizzando per vedere se è necessario ottimizzare alcuni di essi per lo spazio o scegliere strutture dati migliori o perseguire alcune cose su disco, utilizzando il task manager è l'approccio sbagliato. Dovresti quasi certamente usare un profiler

+0

Potrei eventualmente usare un profiler, ma voglio vedere quanta memoria viene utilizzata senza il rallentamento del profiler nell'app stessa. Alla fine, sarà necessario, ma solo per il qui-e-ora di quanta memoria viene effettivamente consumata, sembra che il perfmon sia lo strumento giusto. – mmr

0

Le statistiche di memoria visualizzate dal task manager non sono quasi tutte le statistiche disponibili, né sono particolarmente ben presentate. Vorrei utilizzare il grande strumento gratuito di Microsoft Sysinternals, VMMap, per analizzare ulteriormente la memoria utilizzata dall'applicazione.

Se si tratta di un'applicazione a esecuzione prolungata e l'utilizzo della memoria aumenta nel tempo, sarà l'heap in crescita. Parti dell'heap possono o non possono essere distribuite su disco in qualsiasi momento, ma è necessario ottimizzare l'utilizzo dell'heap. In questo caso è necessario essere profilo dell'applicazione. Se si tratta di un'applicazione .Net, allora posso consigliare il profiler ANTS di Redgate. È molto facile da usare Se si tratta di un'applicazione nativa, il profiler Intel vtune è piuttosto potente. Non è necessario il codice sorgente per il processo che si sta profilando per entrambi gli strumenti.

Entrambe le applicazioni hanno una prova gratuita. In bocca al lupo.

P.S. Scusa se non ho incluso più collegamenti ipertestuali agli strumenti, ma questo è il mio primo post e StackOverflow limita i primi post a un collegamento ipertestuale :-(

Problemi correlati