Sto lavorando su un'applicazione .NET in cui sembra che ci sia una perdita di memoria. So che il libro di testo risponde, che gli eventi devono essere annullati, gli oggetti usa e getta dovrebbero essere smaltiti ecc ...Debugging perdite di memoria .NET - come sapere cosa contiene un riferimento a cosa?
Ho un cablaggio di prova in grado di riprodurre l'errore. Nel finalizzatore di una certa classe scrivo per consolare
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
Nel test harness, sto creando una singola istanza di Foo (che a sua volta crea e interagisce con centinaia di altri tipi) quindi rimuoverlo e invocando la Netturbino.
Sto riscontrando che Foo Finalizer non viene mai chiamato. Ho una classe simile con questa configurazione che è finalizzata come test di controllo.
Quindi la mia domanda è questa:
Come è possibile determinare con strumenti di origine commerciale o aprire esattamente quello sta tenendo un riferimento alla Foo?
Ho una licenza professionale per dotTrace Memory profiler ma non riesco a capire dai file della guida come usarlo.
Aggiornamento: Ora sto usando dotMemory 4.0, che è il successore del (buono, ma inutilizzabile) dotTrace Memory 3.5.
se hai già un profiler impara ad usarlo - non ho lavorato molto con dotTrace ma io gli altri due sono simili nei loro modelli d'uso e ho bisogno di un po 'di "entrare" anche in questo – Carsten
@ CarstenKönig +1, Sto scavando in dotTrace ora. Capisco che posso trovare una lista di oggetti non raccolti per namespace (così ho trovato il mio Foo ingiurioso) e cosa contiene un riferimento a loro, di nuovo filtrato per namespace (centinaia di), ora esaminando un elenco di gestori di eventi sospetti ecc ... –
@ CarstenKönig, infatti, l'ha trovato usando dotTrace! Ha la funzione di approfondire il grafico da gcroot -> Foo, solo un po 'difficile da trovare. Saluti :) –