Red de conocimiento informático - Conocimiento informático - Cómo superar el límite de memoria de 24 M y asignar más memoria a los programas de Android

Cómo superar el límite de memoria de 24 M y asignar más memoria a los programas de Android

Android admite múltiples procesos y el límite de uso de memoria de cada proceso es generalmente de 24 MB. Por lo tanto, al completar algunas operaciones que consumen mucha memoria (como el procesamiento de imágenes de alta resolución), debe abrir un proceso separado para realizar la operación (esto. se puede lograr a través de la configuración anterior (esta operación). Aun así, los desarrolladores no deberían iniciar más procesos que consuman recursos de los usuarios. (Los límites de memoria son 16 MB, 24 MB, 32 MB, 16 MB en modelos muy antiguos, por lo que deberá buscar más información).

Hay otras formas de evitar el límite de memoria y utilizar más recursos para completar la tarea, como se muestra a continuación (para practicar):

Cómo evitar el límite de memoria de 24 MB de Android

El marco de trabajo de Android impone un límite de memoria de 24 MB por proceso. En algunos dispositivos más antiguos, como el G1, el límite es aún menor, de sólo 16 MB.

Además, la memoria utilizada por BitTorrent no está sujeta a este límite.

Más importante aún, la memoria utilizada por Bitmaps también está incluida en el límite. Para aplicaciones que manipulan imágenes, es muy fácil alcanzar este límite y finalizar el proceso mediante una excepción OOM:

E/dalvikvm-heap(12517): 1048576 bytes de asignación externa al proceso. Es demasiado grande.

E/GraphicsJNI(12517): La máquina virtual no nos permite asignar 1048576 bytes

D/AndroidRuntime(12517): Apagando la VM

W /dalvikvm (12517): threadid=1: hilo saliendo con excepción no detectada (group=0x4001d7f0)

E/AndroidRuntime(12517): EXCEPCIÓN FATAL: principal

E/AndroidRuntime(12517) ). java.lang.OutOfMemoryError: el tamaño del mapa de bits excede el presupuesto de la VM

Este límite es ridículamente bajo. Para un dispositivo como el Nexus One con 512 MB de memoria física, establecer el límite de memoria por proceso para actividades en primer plano en solo 5 de la memoria es un error estúpido.

Hay dos formas de asignar más memoria que el límite:

Una forma es asignar memoria mediante código nativo. Usando el NDK (Native Development Kit) y JNI, puede asignar memoria (como malloc/free o new/delete) desde la capa C (como JNI), y dichas asignaciones no contarán para el límite de 24 MB. Es cierto que asignar memoria desde código nativo no es tan conveniente como asignar memoria desde Java, pero se puede usar para almacenar grandes cantidades de datos (incluso datos de imágenes) en la RAM.

Una alternativa es utilizar texturas OpenGL: la memoria de texturas no cuenta para el límite y este método funciona muy bien para imágenes.

Para ver cuánta memoria asignó realmente tu aplicación, puedes usar android.os.Debug.getNativeHeapAllocatedSize().

Usando cualquiera de las técnicas anteriores en un Nexus One, podría asignar fácilmente 300 MB de memoria a un único proceso en primer plano, más de 10 veces el límite predeterminado de 24 MB.