¿Cuál es la cantidad máxima de RAM que puede usar una aplicación?

Tengo mucha curiosidad sobre esta pregunta sobre la administració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 / porcentaje de la RAM total) que puede usar una aplicación de Android (que no es una aplicación de sistema)?
  • ¿Hay alguna diferencia entre las versiones de Android ?
  • ¿Hay alguna diferencia con respecto al fabricante del dispositivo?

Y más importante:

  • ¿Qué “factores secundarios” se tienen en cuenta / de qué depende cuando se trata de que el sistema determine la cantidad de RAM que una aplicación puede usar en tiempo de ejecución (suponiendo que el máximo de memoria por aplicación no es 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 hace sentir muy curioso

Ambos de estos límites son muy bajos.

Acabo de descargar el Administrador de tareas de Android para verificar la memoria RAM de mis dispositivos. Lo que he notado es que hay aplicaciones que usan alrededor de 40-50 megabytes de RAM, lo que obviamente es más que el uso máximo de RAM mencionado, digamos 32 MB. Entonces, ¿cómo determina Android la cantidad de RAM que puede usar una aplicación? ¿Cómo es posible que las aplicaciones excedan ese límite?

Además, noté que algunas aplicaciones de mis servidores se bloquean (¿el sistema te mató?) Con una OutOfMemoryException cuando utilizas alrededor de 30-40 megabytes. Por otro lado, tengo aplicaciones que se ejecutan en mi teléfono con 100 MB o más después de un tiempo (probablemente debido a pérdidas de memoria) que no se cuelgan o mueren. Por lo tanto , obviamente también depende de la aplicación en sí misma cuando se trata de determinar la cantidad de memoria RAM que se puede ahorrar. ¿Cómo es esto posible? (Realicé mis pruebas con un HTC One S con 768 MB de RAM)

Gracias de antemano por su explicación.

Descargo de responsabilidad: NO estoy afiliado a la aplicación Android Task Manager de ninguna manera.

¿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 de sistema)?

Eso varía según el dispositivo. getMemoryClass() en ActivityManager le dará el valor para el dispositivo en el que se ejecuta su código.

¿Hay alguna diferencia entre las versiones de Android?

Sí, en la medida en que los requisitos del sistema operativo han aumentado a lo largo de los años, y los dispositivos tienen que ajustarse para que coincidan.

¿Existen diferencias con respecto al fabricante del dispositivo?

Sí, en la medida en que los fabricantes fabrican dispositivos, y el tamaño varía según el dispositivo.

¿Qué “factores secundarios” se tienen en cuenta a la hora de determinar la cantidad de RAM que puede usar una aplicación?

No tengo idea de qué significan los “factores secundarios”.

Los primeros dispositivos tenían un límite por aplicación de 16 MB; Los dispositivos posteriores booston eso a 24 MB o 32 MB

Eso es correcto. La resolución de pantalla es un factor determinante, ya que las resoluciones más grandes significan mapas de bits más grandes, por lo que las tabletas y teléfonos de alta resolución tenderán a tener valores más altos. Por ejemplo, verá dispositivos con 48MB montones, y no me sorprendería si hay valores más altos que eso.

¿Cómo es posible que las aplicaciones excedan ese límite?

Usted asume que el autor de esa aplicación sabe lo que está haciendo. Teniendo en cuenta que el uso de la memoria de una aplicación es difícil de determinar para un ingeniero principal de Android , no asumiría que la aplicación en cuestión necesariamente proporciona resultados particularmente precisos.

Dicho esto, el código nativo (NDK) no está sujeto al límite del montón. Y, desde Android 3.0, las aplicaciones pueden solicitar un “montón grande”, por lo general en el rango de cientos de MB, pero se considera una forma deficiente para la mayoría de las aplicaciones.

Además, noté que algunas aplicaciones mías se bloquean con una excepción OutOfMemoryException cuando se usan entre 30 y 40 megabytes.

Tenga en cuenta que el recolector de basura de Android no es un recolector de basura compactante. La excepción realmente debería ser CouldNotFindSufficientlyLargeBlockOfMemoryException , pero probablemente se consideró demasiado prolijo. OutOfMemoryException significa que no puede asignar su bloque solicitado , no que ha agotado completamente su heap.

Los límites de memoria por aplicación están aquí según el tamaño de 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