2011-08-30 9 views
23

Estoy trabajando en una aplicación para transmitir música desde Internet ... Mi aplicación hace muchas cosas y está estructurada de esta manera: tengo una vista de pestaña y cada vista está asignada en la memoria así que cada vez Navego por las pestañas, vuelvo a encontrar el estado anterior (cada pestaña también puede abrir una vista web para buscar información sobre canciones, noticias, etc. en internet). Todo eso hace que la ocupación de la memoria sea más fácil de usar ... Después de haber prestado atención para evitar fugas de memoria siguiendo la guía de Android, traté de ver la ocupación del montón y encontré que mi aplicación asigna un máximo de 3.5 MB de memoria y el tamaño del montón asignado es 4.5 - 4.6 MB ... Estoy trabajando en el emulador. . No son tanto, creo, pero a veces mi aplicación se reinicia fundando en LogCat un mensaje extraño comoAndroid grow heap frag case

Grow heap (frag case) to 3.373 for 19764-byte allocation 

¿Qué es? un problema con el emulador? ¿o algo mas? ¿Estoy usando demasiada memoria?

Gracias de antemano por cualquier ayuda :)

Respuesta

35

El tamaño máximo de pila depende del dispositivo (se puede obtener ese valor llamando Runtime.getRuntime().maxMemory()), pero es probablemente alrededor de 32 MB. Para ahorrar memoria, Android no asigna la memoria máxima a cada aplicación automáticamente. En su lugar, espera hasta que la aplicación necesite más memoria y luego le da más espacio de almacenamiento según sea necesario hasta que se alcanza el máximo. Creo que ese es el mensaje Grow heap que ves.

Si realiza una gran cantidad de asignaciones y liberaciones de memoria, puede encontrarse con problemas de fragmentación. Wikipedia tiene una descripción decente here, pero básicamente significa que puede tener disponible la memoria requerida, pero no todo en un solo trozo. De ahí la necesidad de hacer crecer el montón.

Para responder a sus preguntas, probablemente no es un problema de emulador, es solo la naturaleza de su programa, que suena un poco pesado de memoria. Sin embargo, esto no es malo. No creo que usar 3-5MB para varias pestañas con vistas web sea demasiado.

+0

oh gracias por la respuesta ^^ ¿por qué no es algo malo? mi aplicación se cierra cuando esto sucede ... Creo que esto es malo ... ¿es mi culpa? Recibo otro mensaje: heapworker está bloqueado: 13129ms gastados dentro de Landroid/media/MediaPlayer; .finalize() V ... ¿Sabes qué es esto? – Erenwoid

+0

Sí, si su aplicación está saliendo, entonces eso es malo. Quise usar solo ~ 4MB de heap para múltiples páginas web, no está mal. No sé demasiado sobre el problema 'HeapWorker'. Por lo general, realiza un seguimiento de la memoria asignada y ejecuta el recolector de basura en objetos no utilizados. Supongo que uno de tus subprocesos está usando toda la CPU, y el 'MediaPlayer' no tiene tiempo para ejecutar' finalize() ', que es una función que definitivamente no debería tomar 13 segundos. –