posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

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.

Print | posted on lunedì 23 aprile 2007 19:33 |

Feedback

Gravatar

# Re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Sinceramente... sono questi i post che vorrei vedere sempre su UGI! ;-)
Per la memoria, grazie per la spiegazione dettagliata...si, intendevo su process explorer come vedere la dimensione "totale" della memoria di un processo, ma come mi hai confermato non ha molto senso...
C'e' ancora un campo che non ho capito cosa misura..."Virtual Size"...non mi sembra sommare altri valori...
Grazie!
26/04/2007 13:22 | Michele Bersani
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

:-))
Di Virtual Size ne parlavo al workshop e trovi anche una slide che lo cita.
Il suo valore rappresenta lo spazio di indirizzamento assegnato al processo, ed è dinamicamente riassegnato man mano che la memoria viene allocata e disallocata.
Per spazio di indirizzamento si intende la memoria che potenzialmente è allocabile dal processo e quindi comprende anche quella che non è usata affatto.
In pratica invece di assegnare una virtual size di 2^32 per tutti i processi (cosa che evidentemente non avrebbe senso nella maggior parte dei casi), viene assegnata una quantità inferiore.
Anche questo valore è poco significativo visto che non indica memoria necessariamente utilizzata ma un mix tra usata e utilizzabile e in più è anche dinamicamente riassegnato dall'OS.
26/04/2007 14:55 | Raffaele Rialdi
Gravatar

# Re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

OK, ottimo
Grazie Raf!
26/04/2007 18:55 | Michele Bersani
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Ciao Paolo, significa che il tuo processo sta usando molte dll già in uso da altri processi. Questa è una condizione ideale perché molte dll non vengono caricate nuovamente in memoria in quanto altri processi le stanno già usando. E questo anche grazie al fatto che l'OS non ha dovuto farne il rebasing (quindi le DLL sono scritte bene).

È un semplice calcolo aritmetico:
MemUsage = Private + Shared
VMSize = Private

Per rendere tutto più chiaro ti consiglio di guardare Process Explorer ricordando che:
MemUsage ==> Working Set
VMSize ==> Private Bytes

Se ora aggiungi in process explorer le colonne "WS Private" e "WS Shareable" avrai che:
WorkingSet = WS Private + WS Shared
Mentre Private Bytes - WS Private sono le pagine allocate nel file di swap su disco (come scritto nel msg del blog).

Spero di aver fatto chiarezza ...
24/08/2007 18:09 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET