Recentemente stavo lavorando su un servizio che alloca un oggetto di grandi dimensioni. La domanda che mi son posto era, si ma quanto e' grande e dove posso ottimizzare?

Ho aperto Visual Studio profiler ed ho fatto partire il servizio. Dato che l'applicazione, quando parte, deve deserializzare questo oggettone, ci stava mettendo una vita (ho fatto tempo a pranzare ed era ancora li a macinare). Abbandonato il profiler di Visual Studio ed ho usato CLR profiler, niente da fare, stesso problema!

L'unica soluzione che mi e' rimasta in canna e' WindDbg con le estensioni SOS. Faccio partire il processo e carico WinDbg agganciandolo al mio processo. Inizio con leggere le statistiche degli oggetti managed nello heap:

!dumpheap -stat

Da li vedo il mio oggetto in questione con il numero di instanze (1 per l'occasione) e la dimensione. La dimensione che vedo e' quella dell'oggetto da solo, e non include gli oggetti che contiene. Mi serve quindi ricavare l'indirizzo fisico del mio oggettone, richiamo quindi

!dumpheap -mt 0x...

Una volta che ho l'indirizzo fisico del mio oggetto (puntatore), basta chiamare objsize

!objsize 1dd7a55c

E voila', ecco la dimensione reale del mio oggetto. Ora che so quanto e' grande, vorrei sapere quale degli oggetti che referenzia consuma piu' memoria. Faccio il dump dell'oggetto:

!dumpobject 1dd7a55c

Ok, ho tutti gli elementi per procedere nell'ottimizzazione dell'uso della memoria.