Estoy trabajando en una aplicación .NET donde parece haber una pérdida de memoria. Sé que las respuestas de libros de texto, que los eventos deben ser no suscritas, objetos desechables deben ser eliminados, etc ...Depuración de fugas de memoria .NET: cómo saber qué contiene una referencia a qué?
que tienen un arnés de prueba que puede reproducir el error. En el finalizador de cierta clase escribo a la consola
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
en el instrumento de prueba, estoy creando una única instancia de Foo (que a su vez crea e interactúa con cientos de otros tipos) luego se retire e invocando el Recolector de basura.
estoy encontrando la Foo Finalizer nunca es llamado. Tengo una clase similar con esta configuración que se finaliza como una prueba de control.
Así que mi pregunta es la siguiente:
¿Cómo puedo determinar el uso de herramientas comerciales o de código abierto exactamente lo está sosteniendo una referencia a Foo?
Tengo una licencia profesional para dotTrace Memory profiler pero no puedo entender de los archivos de ayuda cómo usarlo.
Actualización: Ahora estoy usando dotMemory 4.0, que es el sucesor de la (buena, pero inutilizable) dotTrace Memory 3.5.
si ya tiene un profiler, aprenda a usarlo - No trabajé mucho con dotTrace, pero los otros dos son similares en los patrones de uso y necesito algo de "get into" también – Carsten
@ CarstenKönig +1 a esto, Estoy cavando en dotTrace ahora. Me imagino que puedo encontrar una lista de objetos no recolectados por espacio de nombres (así encontré mi Foo ofensivo) y lo que contiene una referencia a ellos, nuevamente filtrada por espacio de nombres (cientos), ahora revisando una lista de manejadores de eventos sospechosos, etc ... –
@ CarstenKönig De hecho, lo encontró usando dotTrace! Tiene la función de profundizar en el gráfico de gcroot -> Foo, un poco difícil de encontrar. Saludos :) –