Recolección de basura excesiva (GC_FOR_MALLOC) en el emulador de Android cuando se usa simpleframework

Tengo una aplicación de Android que usa el marco simple para la serialización XML. La aplicación funciona bien en todos los dispositivos reales en los que la he probado sin demoras, pero cuando se ejecuta en el emulador, el recolector de elementos no utilizados se ejecuta durante aproximadamente 3 minutos en cada inicio de la aplicación.

Esto es lo que he observado hasta ahora:

  • La recolección de elementos no utilizados se activa justo antes de serializar los objetos en XML.
  • Solo ocurre antes de que el primer objeto se serialice y se envíe a través de la red, y no ocurre para llamadas sucesivas.
  • El código de serialización se encuentra en una biblioteca separada que se empaqueta y agrega como un archivo .jar en el proyecto.

Aquí está la salida de LogCat:

07-27 08:17:10.275: D/dalvikvm(682): GC_FOR_MALLOC freed 10179 objects / 482344 bytes in 32ms
07-27 08:17:10.435: D/dalvikvm(682): GC_FOR_MALLOC freed 13927 objects / 535968 bytes in 33ms
....... About 300 more similar entries...

Aquí está el código que estoy usando actualmente para la serialización:

public String fromElement(Object request) {
    Writer writer = new StringWriter();
    try {
        serializer.write(request, writer);
        String res = writer.toString();
        Log.d(LOG_TAG, res);
        return writer.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "";
}

Obviamente, esto consume mucho tiempo, cada vez que realizo un cambio en mi código y vuelvo a implementar la aplicación. ¿Alguien más ha experimentado esto al usar el libaray, y si es así, hay alguna manera de evitar que el GC se active cada vez que inicio la aplicación (desde eclipse)? Aumentaría el montón (actualmente establecido en vm.heapSize=24) ¿ayudar? ¿O hay una solución diferente?

preguntado el 27 de julio de 12 a las 21:07

2 Respuestas

Debe actualizar a 2.6.7, hay cambios bastante importantes ahora que se realiza el procesamiento de anotaciones. Resulta que Android tiene un problema bastante conocido con las anotaciones, que se relaciona extrañamente con una mala implementación de java.lang.reflect.Method.equals(Object). Simple 2.6.7 almacena en caché mucho más del procesamiento de anotaciones y debería ser mucho mejor.

respondido 10 nov., 12:13

Actualizar a la nueva versión (2.6.9) pareció solucionar el problema. - Jesurún

Este es un tiro en la oscuridad, pero ¿ha intentado cambiar el tamaño inicial del montón jvm? Es el parámetro -xms. Es posible que su emulador sea demasiado bajo, por lo que durante los primeros minutos intenta constantemente cambiar el tamaño y se atasca en la recolección de basura. Echa un vistazo a este enlace: http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp

Respondido 27 Jul 12, 22:07

Buen punto, ¿es esto lo mismo que el tamaño del montón de eclipse? Mi montón de eclipse es lo suficientemente grande: -XX:MaxPermSize=1G -Xms1G -Xmx2G. ¿Hay algún lugar donde pueda configurar esto específicamente para el emulador, tal vez en el administrador de AVD o en algún otro lugar? Gracias. - Jesurún

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.