Claudio Caldato - CLR Program Manager

Introduzione sui performance counters, sul loro uso e su alcune delle loro peculiarità, siamo poi passati alle principali cause che portano ad una OutOfMemoryException, le cause per ora sono le cause interne, sempre per colpa del ns codice, ma ci sta spiegando cosa succede internamente al fx.

Siamo poi passati agli strumenti necessari per affrontare questi problemi e siamo inevitabilmewnte ricaduti su WinDbg e in generale sui Debugging Tools per Windows, stiamo quindi rivedendo per la 3 volta le stesse cose ma la cosa più interessante è che per la 3 volta le stiamo affrontando da un punto di vista diverso, in questo caso ci stiamo focalizzando sulla memoria e su tutti gli "iusses" ad essa legati sempre nell'ottica di capire come ottimizzare e assecondare al meglio la Garbage Collection...

Molto interessante la possibilità di impostare dei break point in WinDbg. La cosa può essere fatta con il comando "bp" passandogli una serie di parametri (tutt'altro che semplice) che permettono di specificare dove e in che condizioni fermarsi.

Passiamo poi alla casistica in cui i problemi siano legati ad una elevata frammentazione della memoria o al consumo di cicli CPU dovuto ad un'eccessivo lavoro che il GC deve fare, generalmente questo secondo scenario è dovuto ad un elevato numero di Collections in Generation 2 o ad un ciclo di Colletion della Generation 2 troppo costoso.

Ci ha poi mostrato un interessante uso dei Pperformance Counter per cercare di capire quanto tempo spende la ns applicazione per eseguire le collection delle generazioni, questo è estremamente utile in tutti quie casi in cui si ha bisogno di tenere strettamente sotto controllo l'applicazione in quegli scenari simil "real time" o "soft real time" come li ha definiti Claudio.

Durante la Q&A ha poi buttato li una delle novità di Orcas che permetteranno di controllare la modalità con cui il GC interviene, ad esempio chiedendo al GC di non intervenire per un certo "time frame" o chiedendo al GC di intervenire (similmente a GC.Collect()) ma lasciando al GC l'onere di decidere se sia effettivamente necessario intervenire, cosa che non avviene adesso perchè una chiamata a GC.Collect() porta ad una Collection immediata cosa che non è detto sia sempre necessaria. 

Che dire... giornatona oggi, sono veramente soddisfatto, adesso ci (stavolta con Stefano Mostarda) aspettano altre 2 "deep sessions" su WCF che spero non tradiscano le aspettative, ma lo speaker che è lo stesso di ieri e quindi promette bene!

Stay tuned ;-)

.m