punteros puntero memoria manejo estructuras declaracion datos cadenas arreglos aritmetica apuntadores c# memory windows-phone-7 xna xna-4.0

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!



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.



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.