Tengo mucha curiosidad acerca de esta pregunta sobre la gestión de memoria del sistema operativo Android, así que espero una respuesta bastante detallada sobre ese tema.
Lo que me gustaría saber:
- ¿Cuál es la cantidad máxima de memoria (en megabytes / como porcentaje de la RAM total) que puede usar una aplicación de Android (que no es una aplicación del sistema)?
- ¿Hay alguna diferencia entre las versiones de Android ?
- ¿Hay alguna diferencia con respecto al fabricante del dispositivo?
Y más importante:
- ¿Qué se considera / de qué depende cuando se trata de que el sistema determine cuánta RAM puede usar una aplicación en tiempo de ejecución (suponiendo que el máximo de memoria por aplicación no sea un número estático)?
Lo que he escuchado hasta ahora (hasta 2013):
- Los primeros dispositivos Android tenían un límite por aplicación de 16 MB
- Más tarde, este límite aumentó a 24 MB o 32 MB
Lo que me da mucha curiosidad:
Ambos límites son muy bajos.
Recientemente descargué el Administrador de tareas de Android para verificar la RAM de mis dispositivos. Lo que he notado es que hay aplicaciones que usan alrededor de 40-50 megabytes de RAM, lo cual es obviamente más que el uso máximo de RAM mencionado, digamos 32 MB. Entonces, ¿cómo determina Android cuánta RAM puede usar una aplicación? ¿Cómo es posible que las aplicaciones excedan ese límite?
Además, noté que algunas aplicaciones de minas se bloquean (¿son asesinadas por el sistema?) Con una excepción OutOfMemoryException cuando se usan alrededor de 30-40 megabytes. Por otro lado, tengo aplicaciones que se ejecutan en mi teléfono con 100 MB y más después de un tiempo (probablemente debido a pérdidas de memoria) que no se bloquean ni se matan. Entonces , obviamente, también depende de la aplicación en sí cuando se trata de determinar cuánta RAM se puede ahorrar. ¿Cómo es esto posible? (Realicé mis pruebas con un HTC One S con 768 MB de RAM)
Descargo de responsabilidad: NO estoy afiliado a la aplicación Android Task Manager de ninguna manera.
fuente
Es finales de 2018, por lo que las cosas han cambiado.
En primer lugar: ejecute su aplicación y abra la pestaña Android Profiler en Android Studio. Verá cuánta memoria consume, se sorprenderá pero puede asignar mucha RAM.
También aquí hay un gran artículo en documentos oficiales con instrucciones detalladas sobre cómo usar Memory Profiler que puede darle una visión en profundidad de su administración de memoria.
Pero en la mayoría de los casos, su Android Profiler habitual será suficiente para usted.
Por lo general, una aplicación comienza con 50Mb de asignación de RAM, pero salta instantáneamente hasta 90Mb cuando comienza a cargar algunas fotos en la memoria. Cuando abres Activity con un ViewPager con fotos precargadas (3,5Mb cada una) puedes obtener 190Mb fácilmente en segundos.
Pero esto no significa que tenga problemas con la administración de la memoria.
El mejor consejo que puedo dar es seguir las pautas y las mejores prácticas, usar las mejores bibliotecas para cargar imágenes (Glide, Picasso) y estarás bien.
Pero si necesita adaptar algo y realmente necesita saber cuánta memoria puede asignar manualmente, puede obtener memoria libre total y calcular una porción predeterminada (en%) de ella. En mi caso, necesitaba almacenar en caché las fotos descifradas en la memoria, así que no necesito descifrarlas cada vez que el usuario se desliza por la lista.
Para este propósito, puede usar la clase LruCache lista para usar . Es una clase de caché que rastrea automáticamente la cantidad de memoria que asignan sus objetos (o la cantidad de instancias) y elimina la más antigua para mantener la reciente por su historial de uso. Aquí hay un gran tutorial sobre cómo usarlo.
En mi caso, creé 2 instancias de cachés: para pulgares y archivos adjuntos. Los hizo estáticos con acceso singleton para que estén disponibles globalmente en toda la aplicación.
clase de caché:
Así es como calculo la RAM libre disponible y cuánto puedo extraer:
Y así es como lo uso en Adaptadores para obtener la imagen en caché:
y cómo lo configuré en caché en el hilo de fondo (AsyncTask regular):
Mi aplicación está dirigida a API 19+, por lo que los dispositivos no son viejos y estas porciones de RAM disponibles son lo suficientemente buenas para la caché en mi caso (1% y 3%).
Dato curioso: Android no tiene ninguna API u otros hacks para obtener la cantidad de memoria asignada a su aplicación, se calcula sobre la marcha en función de varios factores.
PD: Estoy usando un campo de clase estático para contener un caché, pero según las últimas directrices de Android, se recomienda usar el componente de arquitectura ViewModel para ese propósito.
fuente
Los límites de memoria por aplicación están aquí según el tamaño de la pantalla y la versión de Android: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Fuente: Descargas de compatibilidad de Android http://source.android.com/compatibility/downloads.html ; Documento de definición de compatibilidad (CDD), Sección Compatibilidad de máquina virtual o Compatibilidad de tiempo de ejecución
fuente