Nel primo post sulla memoria ho parlato di "Mem Usage" conosciuto anche come "Working Set".
Alcune definizioni con lo stesso disclaimer del precedente post.
- Committed Page. Pagina di memoria allocate e presenti in RAM o su disco
- Uncommitted Page. Pagine di memoria virtuale non ancora allocate, non usabili e non disponibili. In pratica i "buchi" nello spazio di indirizzamento virtuale. In pratica il tentativo di accedere in lettura o scrittura in una Uncommitted Page risulta nel classico e noto errore di "Access Violation"
Virtual Memory Size
Nel Task Manager di Windows è possibile aggiungere un'altra colonna e visualizzare il valore "VM Size" che corrisponde a "Private Bytes" di Process Explorer e "Commit Size" del Task Manager di Vista.
- Cosa rappresenta questo valore?
Questo valore rappresenta la somma delle pagine private in memoria e sul file di swap. Sono tutte pagine allocate e private dal processo, quindi non condivise.
Questo valore riesce sicuramente a darci un'indicazione più precisa, ma ancora una volta, essendo una somma, non è sufficientemente esplicativo.
- Cosa significa avere un valore alto di "VM Size"? È memoria allocata e privata, quindi è il valore che indica il consumo di memoria della nostra applicazione. Tante più allocazioni facciamo, tanto più alto è questo valore. Naturalmente questo valore include anche la memoria usata dal codice, quindi tutte le DLL non condivise con altri processi.
- Cosa ci dice questo valore sul consumo di RAM? Poco, visto che è una somma di RAM e pagine su disco.
Nel sistema operativo sono presenti diverse primitive per allocare memoria. Per esempio C++ crea un apposito spazio di memoria chiamato Heap e l'allocatore new usa RtlCreateHeap per riservarne una parte. Il Garbage Collector invece per blocchi allocati nel "Large Object Heap" (LOH di cui parlerò in un altro post) usa VirtualAlloc.
Questa differenza è importante perché le allocazioni fatte con VirtualAlloc tipicamente riservano solo dello spazio nella memoria virtuale senza doverci fare un accesso fisico. Per esempio una allocazione di 1MB eseguita dal GC riserva lo spazio ma non incrementa l'uso di RAM fisica fino a che non vado a scriverci dentro.
Per questo motivo può essere utile conoscere quanto occupino le pagine private di un processo in RAM e non su disco. Il Task Manager espone questo numero solo a partire da Vista ed è chiamato "Memory (Private Working Set)" che corrisponde alla colonna "WS Private" di Process Explorer.
Di conseguenza la memoria condivisa con altri processi è pari a Working Set - WS Private che in Process Explorer compare alla colonna "WS Shareable".
E perciò la memoria privata ma riservata nel file di swap è pari a Private Bytes - WS Private, informazione non molto interessante in quanto le pagine possono essere anche solo riservate e non fisicamente scritte nel file di swap.
Questo discorso suggerisce una considerazione importante a proposito del file di swap. La memoria allocabile dai processi è ovviamente dipendente dalla RAM e dalla dimensione del file di swap. Disabilitando il file di swap (diatriba che ogni tanto si legge sui forum), potremmo non essere in grado di allocare sufficiente RAM per soddisfare l'allocazione. Allo stesso tempo però allocare non significa che quella memoria venga scritta subito. Questo significa che lo swap file non verrebbe neppure accesso e quindi non si avrebbe perdita di performance. Perciò io sconsiglio la disabilitazione del file di swap, operazione che in certi scenari, pur in abbondanza di RAM, non fornisce neppure una migliore performance del sistema.