Blog di Davide Vernole

do more with less
posts - 94, comments - 4, trackbacks - 0

Dare una mano al Garbage Collector

Questo post è stato spostato nel mio nuovo blog: Dare una mano al Garbage Collector

Qualche tempo fa sono stato chiamato per aiutare un team di sviluppo a risolvere un problema su un'applicazione web che faceva uso dei Web Services di SharePoint. Il problema che il team riscontrava, in ambiente di produzione, nasceva in modo apparentemente random e rendeva la soluzione inutilizzabile in quanto bloccava IIS e richiedeva un reset dello stesso o, nei casi più fortunati, della sola applicazione.
Indagando con i ragazzi che avevano scritto il codice, abbiamo scoperto che il problema risiedeva nel mancato rilascio delle risorse che i Web Services di SharePoint richiedevano. E' bastato adottare la giusta politica di rilascio delle risorse e il problema è rientrato.

Ma perchè sto parlando di questo? Semplicemente perchè a volte, viziati dai molti automatismi che il framework ci mette a disposizione, ci dimentichiamo che il Garbage Collector non può fare miracoli e soprattutto non è in grado di deallocare memoria per risorse su cui non ha il controllo. Ma allora come si possono evitare questi problemi. La risposta è palese, con una corretta programmazione e quindi utilizzando gli eventuali metodi di Dispose o Close che gli oggetti ci mettono a disposizione. Certo questo presuppone che chi implementa gli oggetti, che utilizziamo nella nostra soluzione, esponga i metodi corretti per il rilascio delle risorse (nel caso dei servizi di SharePoint i metodi c'erano ma non erano stati utilizzati) e che noi ci impegnamo ad usare le tecniche migliori per garantire il rilascio delle risorse managed e non.
Un primo passo può essere quello di utilizzare lo statement using per tutti gli oggetti che implementano l'interfaccia IDisposable in modo da sfruttare il rilascio delle risorse al termine dell 'utilizzo delle stesse. Per esempio, ipotizzando di avere una classe MyClass che implementa l'interfaccia IDisposable, potremmo scrivere:

using (MyClass myClass = GetMyClass()) { myClass.DoSomething(); }

 

Ed all'interno della nostra classe, quale potrebbe essere il sistema migliore per implementare questa interfaccia? Potremmo adottare il Disposable Pattern così come indicato nell'articolo CLR Inside Out: Digging Into IDisposable di Shawn Farkas pubblicato su MSDN Magazine nel numero di Luglio 2007. Questo articolo aiuta a capire come utilizzare in modo appropriato le tecniche di rilascio delle risorse per evitare i comuni errori che si possono commettere in questi casi. Il risultato della disamina presentata nell'articolo è il seguente pattern:

public class DisposableClass : IDisposable { ~DisposableClass() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(disposing) { //Pulizia di tutte le risorse gestite } //Pulizia di tutte le risorse native } }

 

Buona lettura e occhio alle risorse ;-)

 

Technorati tags: ,

Print | posted on mercoledì 18 luglio 2007 14:16 |

Powered by:
Powered By Subtext Powered By ASP.NET