visual tutorial studio page android memory-leaks xamarin memory-profiling heap-dump

tutorial - xamarin android download



Cómo tomar una instantánea de montón de Xamarin. ¿Mono VM de Android? (2)

Antecedentes: estoy intentando rastrear una pérdida de memoria en una aplicación Xamarin.Android. Usando DDMS y Eclipse Memory Profiler, puedo ver qué objetos están vivos. Cuando trato de rastrear lo que los mantiene vivos (GC Root), solo veo "Native stack" (por supuesto).

¿Cómo puedo tomar una instantánea de montón de la VM MONO? ¿Entonces puedo usarlo más tarde con la herramienta heapshot?

¿O hay CUALQUIER OTRA TÉCNICA que pueda usar para encontrar lo que está sosteniendo un objeto vivo en Xamarin. Parte de .NET de Android? ¿Es posible hacer algo desde dentro del programa?


¿Cómo puedo tomar una instantánea de montón de la VM MONO? ¿Entonces puedo usarlo más tarde con la herramienta heapshot?

Ahora es posible obtener instantáneas de montón de Mono VM (probado con Xamarin.Android 4.8.2 beta; puede aplicarse a versiones anteriores, su kilometraje puede variar). Es un proceso de cuatro pasos:

  1. Habilite el registro de heapshot:

    adb shell setprop debug.mono.profile log:heapshot

  2. Comienza tu aplicación (Si su aplicación ya se estaba ejecutando antes (1), elimine y reiníciela).

    Usa tu aplicación

  3. Agarra los datos de perfil de tu aplicación:

    adb pull /data/data/@PACKAGE_NAME@/files/.__override__/profile.mlpd

    @PACKAGE_NAME@ es el nombre del paquete de su aplicación, por ejemplo, si su paquete es FooBar.FooBar-Signed.apk , entonces @PACKAGE_NAME@ será FooBar.FooBar .

  4. Analiza los datos:

    mprof-report profile.mlpd

    mprof-report se incluye con Mono.

Nota : profile.mlpd solo se actualiza cuando se produce un GC, por lo que es posible que desee llamar a GC.Collect() en algún punto "conocido" para asegurarse de que profile.mlpd se actualice periódicamente.


He estado teniendo problemas con el perfil de memoria Android Xamarin, y he usado algunos trucos:

  1. En el lado de Dalvik, he usado Android Monitor para volcar una instantánea de montón y luego abrirla con JProfiler o Eclipse MAT. Este Android estándar.

  2. Una gran parte de mi código se comparte (70-80%) y para verificarlo he creado una aplicación WinForms simple para conducir la API compartida. De esta forma puedo usar .Net Memory Profiler (o ANTS si lo prefiere) así como dotTrace para el rendimiento. Fácilmente podría elegir bastantes problemas de esta manera.

  3. Al utilizar la solución explicada por @jnop anterior, pude abrir el profile.mldp en la herramienta HeapShot de Mono y obtener una herramienta visual en lugar de la salida textual de mprof-report.

Por cierto, debería usarse para votar por mejores perfiladores: http://xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler