In questi giorni ho dovuto fare memory profiling di una grossa applicazione gestionale. Per farlo ho utilizzato un tool commerciale che ritengo molto buono. (Red Gate ANTS Memory Profiler).
Dopo un po' di tempo passato ad analizzare i dati quali Live Instance, Instance difference, Live size, Istance retention graph eccettera, ho scoperto nell'applicazione un memory leak causato da quelle form che utilizzavano il controllo Windows Form ToolStrip (vedi Classe ToolStrip su MSDN) conseguenza di un evento globale, in cui il controllo si "installa" per gestire il suo layout, come si può vedere da questo retention graph visualizzato da ANTS Memory Profiler. (Nota: Il grafico è realizzato su un form di esempio FormWithToolStrip creato per analizzare il problema)
Cercando su Internet ho trovato questo post di stackoverflow ToolStrip memory leak che ne spiega la ragione, indicando come soluzione quella di chiamare il metodo Dispose() sul controllo ToolStrip per permettere la deregistrazione di questi eventi.
Quello a cui bisogna stare molto attenti è quando il form, facendo parte di una applicazione MDI, viene aperto come modale chiamando il metodo Form.ShowDialog() (vedi Form.Close Method (Remarks) su MSDN) in questo caso il nostro form non viene finalizzato creando potenziali memory leak se oggetti ancora vivi o statici lo referenziano direttamente o indirettamente attraverso un controllo contenuto.
Perciò una soluzione è quella di includere il ciclo di vita del Form in un blocco using(...){}, in alternativa chiamare il metodo Dispose() (aggiungerei o Close()) alla fine dell'utilizzo del form modale.