¿Cómo aumentar el tamaño del montón de una aplicación de Android?
Estoy escribiendo una aplicación para Android que utiliza varios modelos 3D. Un modelo así con texturas puede consumir mucha memoria. Descubrí que el fabricante establece un límite en el tamaño del montón que puede usar una aplicación. Por ejemplo, mi tableta Samsung Galaxy Tab 8.9 P7310 puede ocupar 64 MB de memoria.
¿Hay alguna manera de aumentar este tamaño de memoria que puede usar una aplicación?
Puede usar android:largeHeap="true" para solicitar un tamaño de montón mayor, pero esto no funcionará en ningún dispositivo anterior a Honeycomb. En dispositivos anteriores a 2.3, puede usar la clase VMRuntime, pero esto no funcionará en Gingerbread y versiones posteriores.
La única forma de tener un límite lo más grande posible es realizar tareas que consuman mucha memoria a través del NDK, ya que el NDK no impone límites de memoria como el SDK.
Alternativamente, puede cargar solo la parte del modelo que está actualmente a la vista y cargar el resto cuando lo necesite, mientras elimina las partes no utilizadas de la memoria. Sin embargo, es posible que esto no sea posible, dependiendo de su aplicación.
¿Hay alguna manera de aumentar este tamaño de memoria que puede usar una aplicación?
Las aplicaciones que se ejecutan en API Nivel 11+ pueden tener android:largeHeap="true"
el <application>
elemento en el manifiesto para solicitar un tamaño de montón mayor de lo normal, y getLargeMemoryClass()
le ActivityManager
dirán qué tan grande es ese montón. Sin embargo:
Esto solo funciona en API Nivel 11+ (es decir, Honeycomb y superiores)
No hay garantía de qué tan grande será el montón grande.
El usuario percibirá su solicitud de gran montón, porque forzará
a sus otras aplicaciones a salir de la RAMy finalizará los procesos de otras aplicaciones para liberar la RAM del sistema para que la use su gran montón.Debido al punto 3, y al hecho de que espero que
android:largeHeap
se abuse de él, es posible que se abandone el soporte para esto en el futuro, o que se advierta al usuario sobre esto en el momento de la instalación (por ejemplo, deberá solicitar un permiso especial para ello). )Actualmente, esta característica está ligeramente documentada.
No se puede aumentar el tamaño del montón dinámicamente.
puede solicitar usar más usando android:largeHeap="true"
en el manifiesto.
Además, puede utilizar native memory (NDK & JNI)
, para evitar la limitación del tamaño del montón.
Aquí hay algunas publicaciones que hice al respecto:
Cómo almacenar en caché mapas de bits en la memoria nativa
Operaciones de mapa de bits JNI, para ayudar a evitar OOM cuando se utilizan imágenes grandes
y aquí hay una biblioteca que he creado para ello:
- https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
Utilice el segundo proceso. Declarar como AndroidManifest
nuevo Service
con
android:process=":second"
Intercambio entre el primer y segundo proceso finalizado.BroadcastReceiver