2009-02-17 25 views
9

¿Es posible echar un vistazo a todos los objetos .net que se recogen al llamar a GC.Collect()?Cómo depurar la Recolección de basura .net?

Necesito ver qué objetos todavía están en la memoria y no recuperados, para que pueda encontrar dónde debería haber hecho manualmente la recuperación de los objetos, pero el programador lo olvidó.
No quiero llamar a GC.Collect porque alguien en algún lugar se olvidó de tirar un objeto que bloquea algunos controladores.

+0

"should have [collected]" es una frase extraña con GC – user7116

+0

¡Escucho a la gente decir eso todo el tiempo! Dev dice que "está fuera de alcance, ¿por qué no se recoge?" con la suposición de que GC automaticamente hará * todo *. Si bien es un trabajo increíble, no es perfecto. Cuanto más conozca el GC, más sabrá que puede perder memoria si no tiene cuidado. –

+0

"debería haber ..." no se refería a GC, sino a la eliminación manual del objeto: disculpe el uso confuso del lenguaje. – Sam

Respuesta

6

He encontrado que la mejor manera de hacerlo es usar windbg y la extensión SOS (hijo de golpe). Tiene una línea de comando bastante críptica, pero es muy poderosa. Tiene la capacidad de volcar el montón y dividirlo por el montón generacional GC. Una vez que superas la curva de aprendizaje inicial, es muy fácil rastrear qué objetos están vivos en qué parte del montón. Aquí hay algunos sitios web con ejemplos de uso de SOS

EDITAR OP preguntó acerca de la ubicación de sos.dll. Se incluye con la instalación de .Net Framework. Se encuentra en

% windir% \ Microsoft.Net \ Framework \ V2.0.50727 \ sos.dll

Pero una vez que haya cargado windbg que no necesita la ruta completa. Solo nosotros el método .loadby.

sos .loadby Mscorwks.dll

buscará la versión de SOS en el mismo directorio que la versión actual de mscorwks (CLR)

+0

1 para el enlace a Tess Ferrandez el blog –

+0

@Richard, un blog muy bueno de hecho – JaredPar

+0

suena muy bien, ahora sólo tiene que encontrar un lugar para conseguir SOS ... – Sam

1

utilizo SciTech's Memory profiler. Es un poco complicado de usar de inmediato, pero hay algunos buenos videos de instrucción. Te permitirá ver qué objetos no están dispuestos correctamente, en qué generación fueron recolectados. No se pudieron depurar fugas de memoria sin él ...

Cuestiones relacionadas