memory garbage-collection clr windbg sos

memory - ¿Puedo ejecutar una colección de basura.NET desde WinDbg?



garbage-collection clr (4)

Estoy investigando por qué un proceso administrado usa mucha memoria. ¿Hay alguna manera de ejecutar GC.Collect(3) desde WinDbg, de modo que pueda centrarme en la asignación de memoria real?



No creo que pueda activar un GC de WinDbg.

Aquí hay algunas herramientas útiles en las que he llegado a confiar para el seguimiento de asignación de memoria:

  • SOSEX : una extensión adicional de WinDbg para complementar SOS que agrega! Dumpgen para volcar objetos de una generación en particular (genial para descifrar qué hay en LOH y en Gen 2) y el comando! Refs que le dará a los padres refs una objeto.
  • .Net Memory Profiler : esta es una herramienta muy útil cuando se ejecuta de forma interactiva pero también contiene una opción para cargar desde un archivo de volcado. Esto proporciona una forma razonablemente intuitiva de rastrear el uso de la memoria. Vale fácilmente el precio de 250 USD, pero también tienen una evaluación de 14 días.

Hola, Roger. Espero que tu fuga de memoria ya se haya resuelto. :-)

Primero me aseguraría de que se trata de "fuga de memoria administrada". Con esto quiero decir que cuando miras los contadores de Performance Monitor .NET CLR Memory -> # Bytes en todos los montones está aumentando a la misma velocidad que el contador Process -> Private Bytes para el mismo proceso. Si es así, entonces puedes usar las técnicas descritas arriba.

Si no es así, es posible que tenga una pérdida nativa como resultado de la ejecución del código administrado. El más común que he visto está relacionado con los ensamblados .NET que se cargan en el proceso y no se descargan. Esto parece una pérdida de memoria nativa en Perfmon.

Sugeriría que intentes ejecutar una regla de fugas en DebugDiag y ver qué muestra el informe de memoria como las llamadas de pila que se escapan.

Aquí hay otro gran recurso sobre el tema: ¡¡¡tengo una pérdida de memoria !!! ¿Qué debo hacer? (definiendo el "dónde")

Gracias, Aaron


WinDBG es ante todo un Win32 / Kernel Debugger. Por lo que es posible que desee probar uno de los depuradores gestionados, como mDBG . Pero solía hacer compatibilidad con .NET Debugging para MSFT, y nunca he necesitado algo así para solucionar problemas de pérdida de memoria.