Tengo una App con casi 50 clases que estoy configurando android:largeHeap="true"
, como se puede ver a continuación. ¿Es esta una buena practica?
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="Mall"
android:largeHeap="true"
android:logo="@drawable/logo_for_up"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
</application>
Sugiera amablemente las ventajas y desventajas de su uso.
Tengo problemas de memoria, por eso hago esta pregunta.
android
android-largeheap
Intsab Haider
fuente
fuente
Respuestas:
Demasiado tarde para la fiesta aquí, pero ofreceré mis 0.02 $ de todos modos.
No es una buena idea usar
android:largeHeap="true"
aquí el extracto de Google que lo explica,aquí está el enlace completo de la documentación https://developer.android.com/training/articles/memory.html
Después de trabajar de manera insoportable
out of memory errors
, diría que agregar esto al manifiesto para evitar el problema de oom no es un pecado, también como @Milad señala a continuación, no afecta el funcionamiento normal de la aplicaciónAquí están algunos consejos para solucionar con
out of memory errors
1) Utilice estos devolución de llamada que da androide
onLowMemory
,onTrimMemory(int)
y borrar la caché de la imagen como (Picasso, deslizamiento, fresco ....) se puede leer más acerca de ellos aquí y aquí2) comprimir los archivos (imágenes, pdf)
3) leen sobre cómo manejar el mapa de bits de manera más eficiente aquí
4) Use lint regularmente antes de que comience la producción para garantizar que el código sea elegante y no voluminoso
fuente
Creo que esta es una pregunta muy eficaz y permítanme agregar algunos detalles sobre las ventajas y desventajas de usar esta opción.
Lo que obtienes :
OutOfMemoryError
.Lo que pierdes:
Puede perder algunos marcos, lo que puede provocar un enganche visible . Un montón más grande hace que las recolecciones de basura tomen más tiempo. Porque el recolector de basura básicamente tiene que atravesar todo su conjunto de objetos en vivo. Por lo general, el tiempo de pausa de la recolección de basura es de aproximadamente 5 ms, y puede pensar que unos milisegundos no son un gran problema. Pero cada milisegundo cuenta. El dispositivo Android tiene que actualizar su pantalla cada 16 ms y un tiempo de GC más prolongado podría empujar el tiempo de procesamiento de su marco por encima de la barrera de los 16 milisegundos, lo que puede causar un enganche visible.
Además, el cambio de aplicaciones será más lento . El sistema Android puede matar procesos en la caché LRU comenzando con el proceso que se usó menos recientemente, pero también teniendo en cuenta qué procesos consumen más memoria. Entonces, si usa un montón más grande, es más probable que su proceso se elimine cuando esté en segundo plano, lo que significa que puede llevar más tiempo cuando los usuarios quieran cambiar de otras aplicaciones a la suya. Además, es más probable que otros procesos en segundo plano se eliminen cuando su proceso esté en primer plano, porque su aplicación requiere más memoria. Significa que cambiar de su aplicación a otras aplicaciones también lleva más tiempo.
Conclusión:
Evite el uso de la
largeHeap
opción tanto como sea posible. Puede costarle una caída de rendimiento difícil de notar y una mala experiencia de usuario.fuente
No creo que esto suponga un gran problema. La razón por la que tiene el error outOfMemory suele ser cargar demasiadas imágenes en su aplicación o algo así. Si no está satisfecho con el uso de un montón grande, debe encontrar una manera de optimizar el uso de la memoria.
También puede utilizar bibliotecas de carga de imágenes como Picasso , UIL o Glide . Todos ellos tienen la característica de caché de imágenes en memoria y / o en disco.
fuente
En realidad, android: largeHeap es el instrumento para aumentar la memoria asignada a la aplicación.
No existe una definición clara de la necesidad de utilizar esta bandera. Si necesita más memoria, Android le proporciona una herramienta para aumentarla. Pero la necesidad de consumir, tú te defines.
fuente
Si debe usar (y retener) una gran cantidad de memoria, entonces sí, puede y debe usar
android:largeHeap="true"
. Pero si lo usa, debe estar preparado para que su aplicación se vacíe de la memoria siempre que otras aplicaciones estén en primer plano.Por "estar preparado", me refiero a que debe diseñar para esa probabilidad, de modo que sus métodos
onStop()
yonResume()
se escriban de la manera más eficiente posible, al tiempo que se asegura de que todo el estado pertinente se guarde y restaure de una manera que presente una apariencia perfecta para el usuario.Hay tres métodos que se relacionan con este parámetro:
maxMemory()
,getMemoryClass()
, ygetLargeMemoryClass()
.Para la mayoría de los dispositivos,
maxMemory()
representará un valor similar algetMemoryClass()
predeterminado, aunque este último se expresa en megabytes, mientras que el primero se expresa en bytes.Cuando use el
largeHeap
parámetro,maxMemory()
se incrementará a un nivel superior específico del dispositivo, mientrasgetMemoryClass()
que permanecerá igual.getMemoryClass()
no limita el tamaño de su pila, pero le indica la cantidad de pila que debe usar si desea que su aplicación funcione de manera cómoda y compatible dentro de los límites del dispositivo particular en el que se está ejecutando.maxMemory()
Por el contrario, no limitar el tamaño de la pila, y así lo hace a obtener acceso a montón adicional a través de aumentar su valor, ylargeHeap
hace que el valor de incremento. Sin embargo, la cantidad aumentada de montón sigue siendo limitada y ese límite será específico del dispositivo, lo que significa que la cantidad de montón disponible para su aplicación variará, dependiendo de los recursos del dispositivo en el que se ejecuta su aplicación. Por lo tanto, usarlargeHeap
no es una invitación para que su aplicación abandone toda precaución y se abra camino a través del buffet de todo lo que pueda comer.Su aplicación puede descubrir exactamente cuánta memoria estaría disponible en un dispositivo en particular mediante el uso del
largeHeap
parámetro invocando el métodogetLargeMemoryClass()
. El valor devuelto está en megabytes.Esta publicación anterior incluye una discusión del
largeHeap
parámetro, así como una serie de ejemplos de qué cantidades de montón están disponibles con y sin su uso, en varios dispositivos Android específicos:Detectar el tamaño del montón de aplicaciones en Android
No he implementado ninguna de mis propias aplicaciones con este parámetro establecido en verdadero. Sin embargo, tengo un código de memoria intensiva en una de mis aplicaciones para compilar un conjunto de parámetros relacionados con la optimización, que se ejecuta solo durante el desarrollo. Agrego el
largeHeap
parámetro solo durante el desarrollo, para evitar errores de falta de memoria al ejecutar este código. Pero elimino el parámetro (y el código) antes de implementar la aplicación.fuente
Si los procesos de su aplicación deben crearse con un gran montón de Dalvik. Esto se aplica a todos los procesos creados para la aplicación. Solo se aplica a la primera aplicación cargada en un proceso; Si está utilizando una ID de usuario compartida para permitir que varias aplicaciones utilicen un proceso, todas deben utilizar esta opción de forma coherente o tendrán resultados impredecibles.
La mayoría de las aplicaciones no deberían necesitar esto y deberían centrarse en reducir el uso general de la memoria para mejorar el rendimiento. Habilitar esto tampoco garantiza un aumento fijo en la memoria disponible, porque algunos dispositivos están limitados por su memoria total disponible.
fuente