puntero - ¿Cómo puedo saber dónde se está usando la memoria en C#?
punteros c++ (6)
Tengo un C # XNA en ejecución del proyecto WP7 y me doy cuenta de que está consumiendo memoria entre cambios en la pantalla y no devolviéndolo, lo que finalmente da lugar a una excepción.
Miré y miré, pero no puedo, por la vida de mí, descubrir a dónde va este recuerdo.
¿Hay alguna manera de saber dónde se está utilizando la memoria y por qué no se la devuelve al dispositivo?
¡Gracias por cualquier ayuda!
El kit de herramientas de codificación4 contiene un contador de memoria que ayuda a rastrear el uso de la memoria de su aplicación. Aquí está la documentación y un artículo que demuestra su uso.
Puedes probar el ANTS Memory Profiler de Redgate (pero cuesta) y no estoy seguro de usarlo con WP7, pero es para C #.
Hay una versión de prueba gratuita, por lo que es posible que pueda usar eso para ayudar a localizar el problema.
Eqatec tiene un generador de perfiles que funciona con WP7. No es un generador de perfiles de memoria, pero intentaré ver qué muestra. Puede ayudarlo a apuntar en la dirección correcta.
Utilice el CLR Profiler para .NET Framework 2.0 . No es compatible con XNA 4.0 de forma predeterminada, pero Dave en Crappy Coding tiene una solución alternativa .
El que yo uso es Mono profiler . Tiene varias opciones; el uso más simple es
mono --profile=log program.exe
Y luego, después de que el program.exe
saliera, dejaba un archivo de output.mlpd
( output.mlpd
por defecto) , y para leer la información recopilada usa:
mprof-report output.mlpd
Por ejemplo, hago mprof-report output.mlpd | vim -
mprof-report output.mlpd | vim -
.
Por defecto, recopila un montón de información diferente. Al comienzo de la salida (dada la configuración predeterminada) verá la tabla de funciones ordenadas por columna «asignada», por ejemplo, un recorte:
Allocation summary
24 Bytes Count Average Type name
25 7357392 306558 24 System.IntPtr
26 6677904 139123 48 System.Collections.ArrayList.ArrayListEnumeratorSimple
27 5842736 136185 42 Mono.Unix.Native.Syscall._pollfd[]
28 3078176 49566 62 System.Byte[]
29 2574504 38057 67 System.String
30 908320 14803 61 System.Int32[]
31 719984 5294 136 Mono.Globalization.Unicode.SortKeyBuffer
Sus ventajas fuera de mi mente:
- Es una plataforma cruzada, por lo que fácilmente podría perfilar las asignaciones de .NET RAM en GNU / Linux y Mac.
- Lo desarrollan los creadores y los usuarios más grandes de .net - Microsoft. Anteriormente fue desarrollado por Xamarin, pero MS lo compró, y ahora lo mencionaron en la página principal de Mono.
Utilice el CLR Profiler de Microsoft para .NET Framework 4 (gratis) en la versión de Windows de su proyecto.
Al usar esto, puede obtener una línea de tiempo de las asignaciones de memoria de su proyecto. O puede inspeccionar el montón en sí mismo. Te da una lista de todo asignado por tipo. Probablemente verá el objeto que está asignando en exceso, a partir de ahí puede mostrar un gráfico de asignación para ese tipo o ese intervalo de tiempo. Esto mostrará qué funciones asignan esos objetos.
Aquí hay una entrada de blog al azar que tiene algunas capturas de pantalla y discusiones sobre el CLR Profiler en acción. (No es exactamente lo que harás con él, pero es una introducción útil si nunca antes has usado CLR Profiler).
Sin embargo : como está utilizando XNA, y generalmente tiene que esforzarse mucho para que C # se quede sin memoria administrada, probablemente se esté quedando sin memoria no administrada . ¿Hay algún lugar al que no llame Dispose()
antes de dejar de usar un objeto gráfico o de sonido que haya creado? He discutido los detalles de esto un par de veces .
Así que tenga en cuenta que, si tiene muchos objetos muy pequeños que aparecen en el CLR Profiler, de hecho pueden estar consumiendo grandes cantidades de memoria no administrada.